From: Jim Jagielski Date: Mon, 17 Sep 2012 12:11:45 +0000 (+0000) Subject: When concatting for PPR, avoid cases where we X-Git-Tag: 2.5.0-alpha~6329 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=df145fa817fec5e8fb6a25e9c485a68b0b61ede9;p=apache When concatting for PPR, avoid cases where we concat ".../" and "/..." to create "...//..." git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1386576 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/modules/proxy/proxy_util.c b/modules/proxy/proxy_util.c index 6030dbe027..5e7bd764ca 100644 --- a/modules/proxy/proxy_util.c +++ b/modules/proxy/proxy_util.c @@ -859,6 +859,7 @@ PROXY_DECLARE(const char *) ap_proxy_location_reverse_map(request_rec *r, if (ap_proxy_valid_balancer_name((char *)real, 0) && (balancer = ap_proxy_get_balancer(r->pool, sconf, real, 1))) { int n, l3 = 0; + int fake_endwslash = (ent[i].fake[strlen(ent[i].fake)-1] == '/'); proxy_worker **worker = (proxy_worker **)balancer->workers->elts; const char *urlpart = ap_strchr_c(real + sizeof(BALANCER_PREFIX) - 1, '/'); if (urlpart) { @@ -881,12 +882,20 @@ PROXY_DECLARE(const char *) ap_proxy_location_reverse_map(request_rec *r, if (l1 >= l2 + l3 && strncasecmp((*worker)->s->name, url, l2) == 0 && strncmp(urlpart, url + l2, l3) == 0) { + /* Avoid double-slash when concatting */ + if (fake_endwslash && (url[l2 + l3] == '/')) { + l2++; + } u = apr_pstrcat(r->pool, ent[i].fake, &url[l2 + l3], NULL); return ap_is_url(u) ? u : ap_construct_url(r->pool, u, r); } } else if (l1 >= l2 && strncasecmp((*worker)->s->name, url, l2) == 0) { + /* Avoid double-slash when concatting */ + if (fake_endwslash && (url[l2] == '/')) { + l2++; + } u = apr_pstrcat(r->pool, ent[i].fake, &url[l2], NULL); return ap_is_url(u) ? u : ap_construct_url(r->pool, u, r); }