[mod_webdav] special-case If: (<DAV:no-lock>)
(recognize <DAV:no-lock>, but supporting logic is limited)
@@ -3537,9 +3537,9 @@ webdav_has_lock (connection * const con,
* List = "(" 1*Condition ")"
* Condition = ["Not"] (State-token | "[" entity-tag "]")
*/
+ int notflag = 0;
while (*p != '\0' && *++p != ')') {
while (*p == ' ' || *p == '\t') ++p;
- int notflag = 0;
if ( (p[0] & 0xdf) == 'N'
&& (p[1] & 0xdf) == 'O'
&& (p[2] & 0xdf) == 'T') {
@@ -3575,6 +3575,17 @@ webdav_has_lock (connection * const con,
continue;
}
+ if (p[1] == 'D'
+ && 0 == strncmp(p, "<DAV:no-lock>",
+ sizeof("<DAV:no-lock>")-1)) {
+ if (0 == notflag) {
+ http_status_set_error(con,412);/* Precondition Failed */
+ return 0;
+ }
+ p += sizeof("<DAV:no-lock>")-2; /* point p to '>' */
+ continue;
+ }
+
/* State-token (Coded-URL)
* Coded-URL = "<" absolute-URI ">"
* ; No linear whitespace (LWS) allowed in Coded-URL
