File apache2-bsc1207327-fix-mod_proxy-handling-long-urls.patch of Package apache2.27904
*) mod_proxy: Bump shared worker name to 384 chars. PR 53218
modules/proxy/balancers/mod_lbmethod_heartbeat.c | 2 -
modules/proxy/mod_proxy.c | 12 +++---
modules/proxy/mod_proxy.h | 2 +
modules/proxy/mod_proxy_balancer.c | 10 ++---
modules/proxy/mod_proxy_hcheck.c | 29 ++++++++------
modules/proxy/proxy_util.c | 46 +++++++++++++----------
7 files changed, 58 insertions(+), 44 deletions(-)
create mode 100644 changes-entries/proxy_shared_name_ex.txt
--- a/modules/proxy/balancers/mod_lbmethod_heartbeat.c
+++ b/modules/proxy/balancers/mod_lbmethod_heartbeat.c
@@ -303,7 +303,7 @@ static proxy_worker *find_best_hb(proxy_
if (!server) {
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, rv, r, APLOGNO(01214)
- "lb_heartbeat: No server for worker %s", (*worker)->s->name);
+ "lb_heartbeat: No server for worker %s", (*worker)->s->name_ex);
continue;
}
--- a/modules/proxy/mod_proxy.c
+++ b/modules/proxy/mod_proxy.c
@@ -3229,7 +3229,7 @@ static int proxy_status_hook(request_rec
}
else {
ap_rprintf(r, "ProxyBalancer[%d]Worker[%d]Name: %s\n",
- i, n, (*worker)->s->name);
+ i, n, (*worker)->s->name_ex);
ap_rprintf(r, "ProxyBalancer[%d]Worker[%d]Status: %s\n",
i, n, ap_proxy_parse_wstatus(r->pool, *worker));
ap_rprintf(r, "ProxyBalancer[%d]Worker[%d]Elected: %"
@@ -3310,13 +3310,14 @@ static void child_init(apr_pool_t *p, se
"http://www.apache.org", 0);
conf->forward = forward;
PROXY_STRNCPY(conf->forward->s->name, "proxy:forward");
+ PROXY_STRNCPY(conf->forward->s->name_ex, "proxy:forward");
PROXY_STRNCPY(conf->forward->s->hostname, "*"); /* for compatibility */
PROXY_STRNCPY(conf->forward->s->hostname_ex, "*");
PROXY_STRNCPY(conf->forward->s->scheme, "*");
conf->forward->hash.def = conf->forward->s->hash.def =
- ap_proxy_hashfunc(conf->forward->s->name, PROXY_HASHFUNC_DEFAULT);
+ ap_proxy_hashfunc(conf->forward->s->name_ex, PROXY_HASHFUNC_DEFAULT);
conf->forward->hash.fnv = conf->forward->s->hash.fnv =
- ap_proxy_hashfunc(conf->forward->s->name, PROXY_HASHFUNC_FNV);
+ ap_proxy_hashfunc(conf->forward->s->name_ex, PROXY_HASHFUNC_FNV);
/* Do not disable worker in case of errors */
conf->forward->s->status |= PROXY_WORKER_IGNORE_ERRORS;
/* Mark as the "generic" worker */
@@ -3329,13 +3330,14 @@ static void child_init(apr_pool_t *p, se
ap_proxy_define_worker(conf->pool, &reverse, NULL, NULL,
"http://www.apache.org", 0);
PROXY_STRNCPY(reverse->s->name, "proxy:reverse");
+ PROXY_STRNCPY(reverse->s->name_ex, "proxy:reverse");
PROXY_STRNCPY(reverse->s->hostname, "*"); /* for compatibility */
PROXY_STRNCPY(reverse->s->hostname_ex, "*");
PROXY_STRNCPY(reverse->s->scheme, "*");
reverse->hash.def = reverse->s->hash.def =
- ap_proxy_hashfunc(reverse->s->name, PROXY_HASHFUNC_DEFAULT);
+ ap_proxy_hashfunc(reverse->s->name_ex, PROXY_HASHFUNC_DEFAULT);
reverse->hash.fnv = reverse->s->hash.fnv =
- ap_proxy_hashfunc(reverse->s->name, PROXY_HASHFUNC_FNV);
+ ap_proxy_hashfunc(reverse->s->name_ex, PROXY_HASHFUNC_FNV);
/* Do not disable worker in case of errors */
reverse->s->status |= PROXY_WORKER_IGNORE_ERRORS;
/* Mark as the "generic" worker */
--- a/modules/proxy/mod_proxy.h
+++ b/modules/proxy/mod_proxy.h
@@ -371,6 +371,7 @@ PROXY_WORKER_HC_FAIL )
#define PROXY_WORKER_MAX_SECRET_SIZE 64
#define PROXY_RFC1035_HOSTNAME_SIZE 256
+#define PROXY_WORKER_EXT_NAME_SIZE 384
/* RFC-1035 mentions limits of 255 for host-names and 253 for domain-names,
* dotted together(?) this would fit the below size (+ trailing NUL).
@@ -473,6 +474,7 @@ typedef struct {
apr_size_t response_field_size; /* Size of proxy response buffer in bytes. */
unsigned int response_field_size_set:1;
char secret[PROXY_WORKER_MAX_SECRET_SIZE]; /* authentication secret (e.g. AJP13) */
+ char name_ex[PROXY_WORKER_EXT_NAME_SIZE]; /* Extended name (>96 chars for 2.4.x) */
} proxy_worker_shared;
#define ALIGNED_PROXY_WORKER_SHARED_SIZE (APR_ALIGN_DEFAULT(sizeof(proxy_worker_shared)))
--- a/modules/proxy/mod_proxy_balancer.c
+++ b/modules/proxy/mod_proxy_balancer.c
@@ -421,7 +421,7 @@ static int rewrite_url(request_rec *r, p
NULL));
}
- *url = apr_pstrcat(r->pool, worker->s->name, path, NULL);
+ *url = apr_pstrcat(r->pool, worker->s->name_ex, path, NULL);
return OK;
}
@@ -618,7 +618,7 @@ static int proxy_balancer_pre_request(pr
apr_table_setn(r->subprocess_env,
"BALANCER_NAME", (*balancer)->s->name);
apr_table_setn(r->subprocess_env,
- "BALANCER_WORKER_NAME", (*worker)->s->name);
+ "BALANCER_WORKER_NAME", (*worker)->s->name_ex);
apr_table_setn(r->subprocess_env,
"BALANCER_WORKER_ROUTE", (*worker)->s->route);
@@ -641,7 +641,7 @@ static int proxy_balancer_pre_request(pr
}
ap_log_rerror(APLOG_MARK, APLOG_DEBUG, 0, r, APLOGNO(01172)
"%s: worker (%s) rewritten to %s",
- (*balancer)->s->name, (*worker)->s->name, *url);
+ (*balancer)->s->name, (*worker)->s->name_ex, *url);
return access_status;
}
@@ -1722,7 +1722,7 @@ static void balancer_display_page(reques
ap_rvputs(r, "<tr>\n<td><a href=\"",
ap_escape_uri(r->pool, r->uri), "?b=",
balancer->s->name + sizeof(BALANCER_PREFIX) - 1, "&w=",
- ap_escape_uri(r->pool, worker->s->name),
+ ap_escape_uri(r->pool, worker->s->name_ex),
"&nonce=", balancer->s->nonce,
"\">", NULL);
ap_rvputs(r, (*worker->s->uds_path ? "<i>" : ""), ap_proxy_worker_name(r->pool, worker),
@@ -1826,7 +1826,7 @@ static void balancer_display_page(reques
}
ap_rputs("<tr><td colspan='2'><input type=submit value='Submit'></td></tr>\n", r);
ap_rvputs(r, "</table>\n<input type=hidden name='w' id='w' ", NULL);
- ap_rvputs(r, "value=\"", ap_escape_uri(r->pool, wsel->s->name), "\">\n", NULL);
+ ap_rvputs(r, "value=\"", ap_escape_uri(r->pool, wsel->s->name_ex), "\">\n", NULL);
ap_rvputs(r, "<input type=hidden name='b' id='b' ", NULL);
ap_rvputs(r, "value=\"", ap_escape_html(r->pool, bsel->s->name + sizeof(BALANCER_PREFIX) - 1),
"\">\n", NULL);
--- a/modules/proxy/mod_proxy_hcheck.c
+++ b/modules/proxy/mod_proxy_hcheck.c
@@ -472,7 +472,7 @@ static proxy_worker *hc_get_hcworker(sct
if (!hc) {
apr_uri_t uri;
apr_status_t rv;
- const char *url = worker->s->name;
+ const char *url = worker->s->name_ex;
wctx_t *wctx = apr_pcalloc(ctx->p, sizeof(wctx_t));
port = (worker->s->port ? worker->s->port
@@ -482,15 +482,18 @@ static proxy_worker *hc_get_hcworker(sct
worker, worker->s->scheme, worker->s->hostname_ex,
(int)port);
- ap_proxy_define_worker(ctx->p, &hc, NULL, NULL, worker->s->name, 0);
+ ap_proxy_define_worker(ctx->p, &hc, NULL, NULL, worker->s->name_ex, 0);
apr_snprintf(hc->s->name, sizeof hc->s->name, "%pp", worker);
+ apr_snprintf(hc->s->name_ex, sizeof hc->s->name_ex, "%pp", worker);
PROXY_STRNCPY(hc->s->hostname, worker->s->hostname); /* for compatibility */
PROXY_STRNCPY(hc->s->hostname_ex, worker->s->hostname_ex);
PROXY_STRNCPY(hc->s->scheme, worker->s->scheme);
PROXY_STRNCPY(hc->s->hcuri, worker->s->hcuri);
PROXY_STRNCPY(hc->s->hcexpr, worker->s->hcexpr);
- hc->hash.def = hc->s->hash.def = ap_proxy_hashfunc(hc->s->name, PROXY_HASHFUNC_DEFAULT);
- hc->hash.fnv = hc->s->hash.fnv = ap_proxy_hashfunc(hc->s->name, PROXY_HASHFUNC_FNV);
+ hc->hash.def = hc->s->hash.def = ap_proxy_hashfunc(hc->s->name_ex,
+ PROXY_HASHFUNC_DEFAULT);
+ hc->hash.fnv = hc->s->hash.fnv = ap_proxy_hashfunc(hc->s->name_ex,
+ PROXY_HASHFUNC_FNV);
hc->s->port = port;
if (worker->s->conn_timeout_set) {
hc->s->conn_timeout_set = worker->s->conn_timeout_set;
@@ -587,7 +590,7 @@ static apr_status_t backend_cleanup(cons
"Health check %s Status (%d) for %s.",
ap_proxy_show_hcmethod(backend->worker->s->method),
status,
- backend->worker->s->name);
+ backend->worker->s->name_ex);
}
if (status != OK) {
return APR_EGENERAL;
@@ -858,22 +861,22 @@ static apr_status_t hc_check_http(baton_
if (ok > 0) {
ap_log_error(APLOG_MARK, APLOG_TRACE2, 0, ctx->s,
"Condition %s for %s (%s): passed", worker->s->hcexpr,
- hc->s->name, worker->s->name);
+ hc->s->name_ex, worker->s->name_ex);
} else if (ok < 0 || err) {
ap_log_error(APLOG_MARK, APLOG_INFO, 0, ctx->s, APLOGNO(03301)
"Error on checking condition %s for %s (%s): %s", worker->s->hcexpr,
- hc->s->name, worker->s->name, err);
+ hc->s->name_ex, worker->s->name_ex, err);
status = !OK;
} else {
ap_log_error(APLOG_MARK, APLOG_TRACE2, 0, ctx->s,
"Condition %s for %s (%s) : failed", worker->s->hcexpr,
- hc->s->name, worker->s->name);
+ hc->s->name_ex, worker->s->name_ex);
status = !OK;
}
} else if (r->status < 200 || r->status > 399) {
ap_log_error(APLOG_MARK, APLOG_TRACE2, 0, ctx->s,
"Response status %i for %s (%s): failed", r->status,
- hc->s->name, worker->s->name);
+ hc->s->name_ex, worker->s->name_ex);
status = !OK;
}
return backend_cleanup("HCOH", backend, ctx->s, status);
@@ -890,7 +893,7 @@ static void * APR_THREAD_FUNC hc_check(a
ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, APLOGNO(03256)
"%sHealth checking %s", (thread ? "Threaded " : ""),
- worker->s->name);
+ worker->s->name_ex);
if (hc->s->method == TCP) {
rv = hc_check_tcp(baton);
@@ -918,7 +921,7 @@ static void * APR_THREAD_FUNC hc_check(a
worker->s->pcount = 0;
ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, APLOGNO(03302)
"%sHealth check ENABLING %s", (thread ? "Threaded " : ""),
- worker->s->name);
+ worker->s->name_ex);
}
}
@@ -932,7 +935,7 @@ static void * APR_THREAD_FUNC hc_check(a
worker->s->fcount = 0;
ap_log_error(APLOG_MARK, APLOG_INFO, 0, s, APLOGNO(03303)
"%sHealth check DISABLING %s", (thread ? "Threaded " : ""),
- worker->s->name);
+ worker->s->name_ex);
}
}
}
@@ -1009,7 +1012,7 @@ static apr_status_t hc_watchdog_callback
ap_log_error(APLOG_MARK, APLOG_TRACE3, 0, s,
"Checking %s worker: %s [%d] (%pp)", balancer->s->name,
- worker->s->name, worker->s->method, worker);
+ worker->s->name_ex, worker->s->method, worker);
if ((rv = hc_init_worker(ctx, worker)) != APR_SUCCESS) {
worker->s->updated = now;
--- a/modules/proxy/proxy_util.c
+++ b/modules/proxy/proxy_util.c
@@ -888,20 +888,20 @@ PROXY_DECLARE(const char *) ap_proxy_loc
* translate url http://example.com/foo/bar/that to /bash/that
*/
for (n = 0; n < balancer->workers->nelts; n++) {
- l2 = strlen((*worker)->s->name);
+ l2 = strlen((*worker)->s->name_ex);
if (urlpart) {
/* urlpart (l3) assuredly starts with its own '/' */
- if ((*worker)->s->name[l2 - 1] == '/')
+ if ((*worker)->s->name_ex[l2 - 1] == '/')
--l2;
if (l1 >= l2 + l3
- && strncasecmp((*worker)->s->name, url, l2) == 0
+ && strncasecmp((*worker)->s->name_ex, url, l2) == 0
&& strncmp(urlpart, url + l2, l3) == 0) {
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) {
+ else if (l1 >= l2 && strncasecmp((*worker)->s->name_ex, url, l2) == 0) {
/* edge case where fake is just "/"... avoid double slash */
if ((ent[i].fake[0] == '/') && (ent[i].fake[1] == 0) && (url[l2] == '/')) {
u = apr_pstrdup(r->pool, &url[l2]);
@@ -1435,7 +1435,8 @@ static proxy_worker *proxy_balancer_get_
if (best_worker) {
ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, APLOGNO(10123)
"proxy: %s selected worker \"%s\" : busy %" APR_SIZE_T_FMT " : lbstatus %d",
- balancer->lbmethod->name, best_worker->s->name, best_worker->s->busy, best_worker->s->lbstatus);
+ balancer->lbmethod->name, best_worker->s->name_ex,
+ best_worker->s->busy, best_worker->s->lbstatus);
}
return best_worker;
@@ -1659,9 +1660,9 @@ PROXY_DECLARE(char *) ap_proxy_worker_na
{
if (!(*worker->s->uds_path) || !p) {
/* just in case */
- return worker->s->name;
+ return worker->s->name_ex;
}
- return apr_pstrcat(p, "unix:", worker->s->uds_path, "|", worker->s->name, NULL);
+ return apr_pstrcat(p, "unix:", worker->s->uds_path, "|", worker->s->name_ex, NULL);
}
PROXY_DECLARE(int) ap_proxy_worker_can_upgrade(apr_pool_t *p,
@@ -1791,17 +1792,17 @@ PROXY_DECLARE(proxy_worker *) ap_proxy_g
proxy_worker **workers = (proxy_worker **)balancer->workers->elts;
for (i = 0; i < balancer->workers->nelts; i++, workers++) {
worker = *workers;
- if ( ((worker_name_length = strlen(worker->s->name)) <= url_length)
+ if ( ((worker_name_length = strlen(worker->s->name_ex)) <= url_length)
&& (worker_name_length >= min_match)
&& (worker_name_length > max_match)
&& (worker->s->is_name_matchable
|| ((mask & AP_PROXY_WORKER_IS_PREFIX)
- && strncmp(url_copy, worker->s->name,
+ && strncmp(url_copy, worker->s->name_ex,
worker_name_length) == 0))
&& (!worker->s->is_name_matchable
|| ((mask & AP_PROXY_WORKER_IS_MATCH)
&& ap_proxy_strcmp_ematch(url_copy,
- worker->s->name) == 0)) ) {
+ worker->s->name_ex) == 0)) ) {
max_worker = worker;
max_match = worker_name_length;
}
@@ -1809,17 +1810,17 @@ PROXY_DECLARE(proxy_worker *) ap_proxy_g
} else {
worker = (proxy_worker *)conf->workers->elts;
for (i = 0; i < conf->workers->nelts; i++, worker++) {
- if ( ((worker_name_length = strlen(worker->s->name)) <= url_length)
+ if ( ((worker_name_length = strlen(worker->s->name_ex)) <= url_length)
&& (worker_name_length >= min_match)
&& (worker_name_length > max_match)
&& (worker->s->is_name_matchable
|| ((mask & AP_PROXY_WORKER_IS_PREFIX)
- && strncmp(url_copy, worker->s->name,
+ && strncmp(url_copy, worker->s->name_ex,
worker_name_length) == 0))
&& (!worker->s->is_name_matchable
|| ((mask & AP_PROXY_WORKER_IS_MATCH)
&& ap_proxy_strcmp_ematch(url_copy,
- worker->s->name) == 0)) ) {
+ worker->s->name_ex) == 0)) ) {
max_worker = worker;
max_match = worker_name_length;
}
@@ -1979,9 +1980,14 @@ PROXY_DECLARE(char *) ap_proxy_define_wo
wshared = apr_palloc(p, sizeof(proxy_worker_shared));
memset(wshared, 0, sizeof(proxy_worker_shared));
+ if (PROXY_STRNCPY(wshared->name_ex, ptr) != APR_SUCCESS) {
+ ap_log_error(APLOG_MARK, APLOG_ERR, 0, ap_server_conf, APLOGNO(10366)
+ "Alert! worker name (%s) too long; truncated to: %s", ptr, wshared->name_ex);
+ }
if (PROXY_STRNCPY(wshared->name, ptr) != APR_SUCCESS) {
- ap_log_error(APLOG_MARK, APLOG_ERR, 0, ap_server_conf, APLOGNO(02808)
- "Alert! worker name (%s) too long; truncated to: %s", ptr, wshared->name);
+ ap_log_error(APLOG_MARK, APLOG_INFO, 0, ap_server_conf, APLOGNO(010118)
+ "worker name (%s) too long; truncated for legacy modules that do not use "
+ "proxy_worker_shared->name_ex: %s", ptr, wshared->name);
}
if (PROXY_STRNCPY(wshared->scheme, uri.scheme) != APR_SUCCESS) {
ap_log_error(APLOG_MARK, APLOG_ERR, 0, ap_server_conf, APLOGNO(010117)
@@ -2004,8 +2010,8 @@ PROXY_DECLARE(char *) ap_proxy_define_wo
wshared->fails = 1;
wshared->interval = apr_time_from_sec(HCHECK_WATHCHDOG_DEFAULT_INTERVAL);
wshared->smax = -1;
- wshared->hash.def = ap_proxy_hashfunc(wshared->name, PROXY_HASHFUNC_DEFAULT);
- wshared->hash.fnv = ap_proxy_hashfunc(wshared->name, PROXY_HASHFUNC_FNV);
+ wshared->hash.def = ap_proxy_hashfunc(wshared->name_ex, PROXY_HASHFUNC_DEFAULT);
+ wshared->hash.fnv = ap_proxy_hashfunc(wshared->name_ex, PROXY_HASHFUNC_FNV);
wshared->was_malloced = (mask & AP_PROXY_WORKER_IS_MALLOCED) != 0;
wshared->is_name_matchable = 0;
if (sockpath) {
@@ -2029,7 +2035,7 @@ PROXY_DECLARE(char *) ap_proxy_define_wo
if (mask & AP_PROXY_WORKER_IS_MATCH) {
(*worker)->s->is_name_matchable = 1;
- if (ap_strchr_c((*worker)->s->name, '$')) {
+ if (ap_strchr_c((*worker)->s->name_ex, '$')) {
/* Before AP_PROXY_WORKER_IS_MATCH (< 2.4.47), a regex worker
* with dollar substitution was never matched against the actual
* URL thus the request fell through the generic worker. To avoid
@@ -2334,7 +2340,7 @@ PROXY_DECLARE(int) ap_proxy_pre_request(
if (*worker) {
ap_log_rerror(APLOG_MARK, APLOG_TRACE2, 0, r,
"%s: found worker %s for %s",
- (*worker)->s->scheme, (*worker)->s->name, *url);
+ (*worker)->s->scheme, (*worker)->s->name_ex, *url);
if (!forward && !fix_uds_filename(r, url)) {
return HTTP_INTERNAL_SERVER_ERROR;
}
@@ -3717,7 +3723,7 @@ PROXY_DECLARE(apr_status_t) ap_proxy_syn
}
ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, APLOGNO(02403)
"grabbing shm[%d] (0x%pp) for worker: %s", i, (void *)shm,
- (*runtime)->s->name);
+ (*runtime)->s->name_ex);
}
}
if (b->s->need_reset) {