svn commit: r1935940 - httpd/httpd/trunk/modules/dav/main
[email protected] Mon, 06 Jul 2026 12:01:57 -0000
| Newsgroups | gmane.comp.apache.cvs |
|---|---|
| Message-ID | <178333931776.428714.4654767725460470707@svn03-he-fi> |
Author: jorton
Date: Mon Jul 6 12:01:57 2026
New Revision: 1935940
Log:
mod_dav: Refactor Lock-Token parsing into dav_parse_locktoken()
helper in util.c, replacing duplicated inline parsing in
mod_dav.c and ms_wdv.c.
* modules/dav/main/util.c (dav_parse_locktoken): New function.
* modules/dav/main/mod_dav.h (dav_parse_locktoken): Declare it.
* modules/dav/main/mod_dav.c (dav_method_unlock): Use
dav_parse_locktoken() instead of inline bracket parsing.
* modules/dav/main/ms_wdv.c (dav_process_ms_wdv_lock): Likewise.
(dav_process_ms_wdv_if_header): Add length check before indexing
the If header value to avoid reading past an empty string.
Submitted by: metsw24-max <metsw24 gmail.com>
Github: closes #618
Modified:
httpd/httpd/trunk/modules/dav/main/mod_dav.c
httpd/httpd/trunk/modules/dav/main/mod_dav.h
httpd/httpd/trunk/modules/dav/main/ms_wdv.c
httpd/httpd/trunk/modules/dav/main/util.c
Modified: httpd/httpd/trunk/modules/dav/main/mod_dav.c
==============================================================================
--- httpd/httpd/trunk/modules/dav/main/mod_dav.c Mon Jul 6 11:55:34 2026 (r1935939)
+++ httpd/httpd/trunk/modules/dav/main/mod_dav.c Mon Jul 6 12:01:57 2026 (r1935940)
@@ -3606,18 +3606,9 @@ static int dav_method_unlock(request_rec
return HTTP_BAD_REQUEST;
}
- locktoken_txt = apr_pstrdup(r->pool, const_locktoken_txt);
- if (locktoken_txt[0] != '<') {
- /* ### should provide more specifics... */
- return HTTP_BAD_REQUEST;
- }
- locktoken_txt++;
-
- if (locktoken_txt[strlen(locktoken_txt) - 1] != '>') {
- /* ### should provide more specifics... */
- return HTTP_BAD_REQUEST;
- }
- locktoken_txt[strlen(locktoken_txt) - 1] = '\0';
+ err = dav_parse_locktoken(r->pool, const_locktoken_txt, &locktoken_txt);
+ if (err != NULL)
+ return dav_handle_err(r, err, NULL);
if ((err = (*locks_hooks->parse_locktoken)(r->pool, locktoken_txt,
&locktoken)) != NULL) {
Modified: httpd/httpd/trunk/modules/dav/main/mod_dav.h
==============================================================================
--- httpd/httpd/trunk/modules/dav/main/mod_dav.h Mon Jul 6 11:55:34 2026 (r1935939)
+++ httpd/httpd/trunk/modules/dav/main/mod_dav.h Mon Jul 6 12:01:57 2026 (r1935940)
@@ -1331,6 +1331,9 @@ struct dav_hooks_propdb
DAV_DECLARE(time_t) dav_get_timeout(request_rec *r);
DAV_DECLARE(time_t) dav_get_timeout_string(request_rec *r, const char *s);
+DAV_DECLARE(dav_error *) dav_parse_locktoken(apr_pool_t *p,
+ const char *input,
+ char **output);
/*
** Opaque, provider-specific information for a lock database.
@@ -2756,5 +2759,4 @@ DAV_DECLARE(const dav_resource_type_prov
#endif
#endif /* _MOD_DAV_H_ */
-/** @} */
-
+/** @} */
\ No newline at end of file
Modified: httpd/httpd/trunk/modules/dav/main/ms_wdv.c
==============================================================================
--- httpd/httpd/trunk/modules/dav/main/ms_wdv.c Mon Jul 6 11:55:34 2026 (r1935939)
+++ httpd/httpd/trunk/modules/dav/main/ms_wdv.c Mon Jul 6 12:01:57 2026 (r1935940)
@@ -36,13 +36,16 @@ static void delete_if_fixup(request_rec
const char *if_hdr;
const char *cp;
apr_size_t len;
+ int has_open, has_close;
if ((if_hdr = apr_table_get(r->headers_in, "If")) == NULL)
goto out;
/* check for parenthesis enclosed value */
len = strlen(if_hdr);
- if (if_hdr[0] != '(' || if_hdr[len - 1]!= ')')
+ has_open = (len > 0 && if_hdr[0] == '(');
+ has_close = (len > 0 && if_hdr[len - 1] == ')');
+ if (!has_open || !has_close)
goto out;
for (cp = if_hdr; *cp; cp++) {
@@ -197,10 +200,13 @@ static dav_error *mswdv_combined_lock(re
* section 4.5 suggests using Lock-Token without brakets.
*/
if (lock_token_hdr) {
- apr_size_t len = strlen(lock_token_hdr);
+ char *parsed_locktoken;
- if (lock_token_hdr[0] == '<' || lock_token_hdr[len - 1] == '>')
- lock_token_hdr = apr_pstrndup(r->pool, lock_token_hdr + 1, len - 2);
+ err = dav_parse_locktoken(r->pool, lock_token_hdr, &parsed_locktoken);
+ if (err != NULL)
+ goto out;
+
+ lock_token_hdr = parsed_locktoken;
}
if (lock_timeout_hdr) {
@@ -832,4 +838,3 @@ DAV_DECLARE(apr_status_t) dav_mswdv_inpu
return APR_SUCCESS;
}
-
Modified: httpd/httpd/trunk/modules/dav/main/util.c
==============================================================================
--- httpd/httpd/trunk/modules/dav/main/util.c Mon Jul 6 11:55:34 2026 (r1935939)
+++ httpd/httpd/trunk/modules/dav/main/util.c Mon Jul 6 12:01:57 2026 (r1935940)
@@ -590,6 +590,36 @@ DAV_DECLARE(time_t) dav_get_timeout_stri
return DAV_TIMEOUT_INFINITE;
}
+DAV_DECLARE(dav_error *) dav_parse_locktoken(apr_pool_t *p,
+ const char *input,
+ char **output)
+{
+ char *token;
+ apr_size_t len;
+ int has_open;
+ int has_close;
+
+ *output = NULL;
+
+ len = strlen(input);
+ has_open = (len > 0 && input[0] == '<');
+ has_close = (len > 2 && input[len - 1] == '>');
+
+ if (len < 2 || !has_open || !has_close) {
+ return dav_new_error(p, HTTP_BAD_REQUEST, 0, 0,
+ "Malformed Lock-Token");
+ }
+
+ token = apr_pstrmemdup(p, input + 1, len - 2);
+ if (*token == '\0') {
+ return dav_new_error(p, HTTP_BAD_REQUEST, 0, 0,
+ "Malformed Lock-Token");
+ }
+
+ *output = token;
+ return NULL;
+}
+
/* ---------------------------------------------------------------
**
** If Header processing