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
git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@
1935940 13f79535-47bb-0310-9956-
ffa450edef68
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) {
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.
#endif
#endif /* _MOD_DAV_H_ */
-/** @} */
-
+/** @} */
\ No newline at end of file
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++) {
* 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) {
return APR_SUCCESS;
}
-
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