From: Eric Covener Date: Wed, 21 Apr 2021 01:10:12 +0000 (+0000) Subject: Merge r1889036 from trunk: X-Git-Tag: 2.4.47~8 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=eb986059aa5aa0b6c1d52714ea83e3dd758afdd1;p=thirdparty%2Fapache%2Fhttpd.git Merge r1889036 from trunk: legacy default slash-matching behavior w/ 'MergeSlashes OFF' Submitted By: Ruediger Pluem Reviewed By: covener, rpluem, ylavic git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1889038 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/server/request.c b/server/request.c index 0f150a763d6..299eae04d3f 100644 --- a/server/request.c +++ b/server/request.c @@ -1420,7 +1420,20 @@ AP_DECLARE(int) ap_location_walk(request_rec *r) cache = prep_walk_cache(AP_NOTE_LOCATION_WALK, r); cached = (cache->cached != NULL); - entry_uri = r->uri; + + /* + * When merge_slashes is set to AP_CORE_CONFIG_OFF the slashes in r->uri + * have not been merged. But for Location walks we always go with merged + * slashes no matter what merge_slashes is set to. + */ + if (sconf->merge_slashes != AP_CORE_CONFIG_OFF) { + entry_uri = r->uri; + } + else { + char *uri = apr_pstrdup(r->pool, r->uri); + ap_no2slash(uri); + entry_uri = uri; + } /* If we have an cache->cached location that matches r->uri, * and the vhost's list of locations hasn't changed, we can skip @@ -1488,7 +1501,7 @@ AP_DECLARE(int) ap_location_walk(request_rec *r) pmatch = apr_palloc(rxpool, nmatch*sizeof(ap_regmatch_t)); } - if (ap_regexec(entry_core->r, entry_uri, nmatch, pmatch, 0)) { + if (ap_regexec(entry_core->r, r->uri, nmatch, pmatch, 0)) { continue; } @@ -1498,7 +1511,7 @@ AP_DECLARE(int) ap_location_walk(request_rec *r) apr_table_setn(r->subprocess_env, ((const char **)entry_core->refs->elts)[i], apr_pstrndup(r->pool, - entry_uri + pmatch[i].rm_so, + r->uri + pmatch[i].rm_so, pmatch[i].rm_eo - pmatch[i].rm_so)); } }