From: Yann Ylavic Date: Mon, 23 Nov 2020 11:03:45 +0000 (+0000) Subject: mod_proxy: pconf vs pchild consistency, and correctness in ONE_PROCESS mode. X-Git-Tag: 2.5.0-alpha2-ci-test-only~1129 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=79739abe6661dd7a2bebb731c7b7c1478233f1da;p=thirdparty%2Fapache%2Fhttpd.git mod_proxy: pconf vs pchild consistency, and correctness in ONE_PROCESS mode. Consistently use pconf for ap_proxy_define_{worker,balancer}() and pchild for ap_proxu_initialize_{worker,balancer}() in mod_proxy [child_]init code. pchild is needed in _initialize() for mutexes/shms' child_init and cleanup, and to avoid a crash on shutdown (i.e. ap_terminate) in ONE_PROCESS mode, where worker->cp->pool is destroyed twice, let's register conn_pool_cleanup() as a pre_cleanup of pchild. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1883744 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/modules/proxy/mod_proxy.c b/modules/proxy/mod_proxy.c index c01cdc64365..3380e1d5e00 100644 --- a/modules/proxy/mod_proxy.c +++ b/modules/proxy/mod_proxy.c @@ -3390,12 +3390,13 @@ static void child_init(apr_pool_t *p, server_rec *s) */ worker = (proxy_worker *)conf->workers->elts; for (i = 0; i < conf->workers->nelts; i++, worker++) { - ap_proxy_initialize_worker(worker, s, conf->pool); + ap_proxy_initialize_worker(worker, s, p); } /* Create and initialize forward worker if defined */ if (conf->req_set && conf->req) { proxy_worker *forward; - ap_proxy_define_worker(p, &forward, NULL, NULL, "http://www.apache.org", 0); + ap_proxy_define_worker(conf->pool, &forward, NULL, NULL, + "http://www.apache.org", 0); conf->forward = forward; PROXY_STRNCPY(conf->forward->s->name, "proxy:forward"); PROXY_STRNCPY(conf->forward->s->hostname, "*"); /* for compatibility */ @@ -3409,12 +3410,13 @@ static void child_init(apr_pool_t *p, server_rec *s) conf->forward->s->status |= PROXY_WORKER_IGNORE_ERRORS; /* Mark as the "generic" worker */ conf->forward->s->status |= PROXY_WORKER_GENERIC; - ap_proxy_initialize_worker(conf->forward, s, conf->pool); + ap_proxy_initialize_worker(conf->forward, s, p); /* Disable address cache for generic forward worker */ conf->forward->s->is_address_reusable = 0; } if (!reverse) { - ap_proxy_define_worker(p, &reverse, NULL, NULL, "http://www.apache.org", 0); + 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->hostname, "*"); /* for compatibility */ PROXY_STRNCPY(reverse->s->hostname_ex, "*"); @@ -3428,7 +3430,7 @@ static void child_init(apr_pool_t *p, server_rec *s) /* Mark as the "generic" worker */ reverse->s->status |= PROXY_WORKER_GENERIC; conf->reverse = reverse; - ap_proxy_initialize_worker(conf->reverse, s, conf->pool); + ap_proxy_initialize_worker(conf->reverse, s, p); /* Disable address cache for generic reverse worker */ reverse->s->is_address_reusable = 0; } diff --git a/modules/proxy/mod_proxy_balancer.c b/modules/proxy/mod_proxy_balancer.c index 09bfaf0caa6..66be13a6d62 100644 --- a/modules/proxy/mod_proxy_balancer.c +++ b/modules/proxy/mod_proxy_balancer.c @@ -2014,7 +2014,7 @@ static void balancer_child_init(apr_pool_t *p, server_rec *s) balancer->s->name); exit(1); /* Ugly, but what else? */ } - init_balancer_members(conf->pool, s, balancer); + init_balancer_members(p, s, balancer); } s = s->next; } diff --git a/modules/proxy/proxy_util.c b/modules/proxy/proxy_util.c index 7d9ea177c48..0b342242e59 100644 --- a/modules/proxy/proxy_util.c +++ b/modules/proxy/proxy_util.c @@ -1488,6 +1488,8 @@ static void init_conn_pool(apr_pool_t *p, proxy_worker *worker) cp->pool = pool; cp->dns_pool = dns_pool; worker->cp = cp; + + apr_pool_pre_cleanup_register(p, worker, conn_pool_cleanup); } PROXY_DECLARE(int) ap_proxy_connection_reusable(proxy_conn_rec *conn) @@ -2114,9 +2116,6 @@ PROXY_DECLARE(apr_status_t) ap_proxy_initialize_worker(proxy_worker *worker, ser connection_constructor, connection_destructor, worker, worker->cp->pool); - apr_pool_pre_cleanup_register(worker->cp->pool, worker, - conn_pool_cleanup); - ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, s, APLOGNO(00930) "initialized pool in child %" APR_PID_T_FMT " for (%s) min=%d max=%d smax=%d", getpid(), worker->s->hostname_ex, worker->s->min,