On Wed, Sep 25, 2019 at 3:07 PM Stefan Eissing
<[email protected]> wrote:
>
> Hmm, far less likely, but still:
Likewise, I think the MPMs themselves shouldn't use pchild for their
internal allocations possibly still in use at exit().
So v2 (attached) may be the thing..
Index: include/http_main.h
===================================================================
--- include/http_main.h (revision 1866998)
+++ include/http_main.h (working copy)
@@ -52,6 +52,8 @@ AP_DECLARE_DATA extern const char *ap_runtime_dir;
AP_DECLARE_DATA extern server_rec *ap_server_conf;
/** global pool, for access prior to creation of server_rec */
AP_DECLARE_DATA extern apr_pool_t *ap_pglobal;
+/** configuration pool, cleared for each reload */
+AP_DECLARE_DATA extern apr_pool_t *ap_pconf;
/** state of the server (startup, exiting, ...) */
AP_DECLARE_DATA extern int ap_main_state;
/** run mode (normal, config test, config dump, ...) */
Index: server/config.c
===================================================================
--- server/config.c (revision 1866998)
+++ server/config.c (working copy)
@@ -62,6 +62,7 @@ AP_DECLARE_DATA const char *ap_server_root = NULL;
AP_DECLARE_DATA const char *ap_runtime_dir = NULL;
AP_DECLARE_DATA server_rec *ap_server_conf = NULL;
AP_DECLARE_DATA apr_pool_t *ap_pglobal = NULL;
+AP_DECLARE_DATA apr_pool_t *ap_pconf = NULL;
AP_DECLARE_DATA apr_array_header_t *ap_server_pre_read_config = NULL;
AP_DECLARE_DATA apr_array_header_t *ap_server_post_read_config = NULL;
Index: server/main.c
===================================================================
--- server/main.c (revision 1866998)
+++ server/main.c (working copy)
@@ -513,7 +513,7 @@ static void usage(process_rec *process)
process = init_process(&argc, &argv);
ap_pglobal = process->pool;
- pconf = process->pconf;
+ ap_pconf = pconf = process->pconf;
ap_server_argv0 = process->short_name;
ap_init_rng(ap_pglobal);
Index: modules/core/mod_watchdog.c
===================================================================
--- modules/core/mod_watchdog.c (revision 1866998)
+++ modules/core/mod_watchdog.c (working copy)
@@ -567,8 +567,8 @@ static void wd_child_init_hook(apr_pool_t *p, serv
"Watchdog: nothing configured?");
return;
}
- if ((wl = ap_list_provider_names(p, AP_WATCHDOG_PGROUP,
- AP_WATCHDOG_CVERSION))) {
+ if ((wl = ap_list_provider_names(wd_server_conf->pool, AP_WATCHDOG_PGROUP,
+ AP_WATCHDOG_CVERSION))) {
const ap_list_provider_names_t *wn;
int i;
wn = (ap_list_provider_names_t *)wl->elts;
Index: modules/ssl/ssl_engine_init.c
===================================================================
--- modules/ssl/ssl_engine_init.c (revision 1866998)
+++ modules/ssl/ssl_engine_init.c (working copy)
@@ -2159,14 +2159,15 @@ void ssl_init_Child(apr_pool_t *p, server_rec *s)
{
SSLModConfigRec *mc = myModConfig(s);
mc->pid = getpid(); /* only call getpid() once per-process */
+ (void)p;
/* XXX: there should be an ap_srand() function */
srand((unsigned int)time(NULL));
/* open the mutex lockfile */
- ssl_mutex_reinit(s, p);
+ ssl_mutex_reinit(s, ap_pconf);
#ifdef HAVE_OCSP_STAPLING
- ssl_stapling_mutex_reinit(s, p);
+ ssl_stapling_mutex_reinit(s, ap_pconf);
#endif
}
Index: server/mpm/event/event.c
===================================================================
--- server/mpm/event/event.c (revision 1866998)
+++ server/mpm/event/event.c (working copy)
@@ -2760,10 +2760,10 @@ static void child_main(int child_num_arg, int chil
}
/*stuff to do before we switch id's, so we have permissions. */
- ap_reopen_scoreboard(pchild, NULL, 0);
+ ap_reopen_scoreboard(pconf, NULL, 0);
/* done with init critical section */
- if (ap_run_drop_privileges(pchild, ap_server_conf)) {
+ if (ap_run_drop_privileges(pconf, ap_server_conf)) {
clean_child_exit(APEXIT_CHILDFATAL);
}
@@ -2799,9 +2799,9 @@ static void child_main(int child_num_arg, int chil
* and we want a 0 entry to indicate a thread which was not created
*/
threads = ap_calloc(threads_per_child, sizeof(apr_thread_t *));
- ts = apr_palloc(pchild, sizeof(*ts));
+ ts = apr_palloc(pconf, sizeof(*ts));
- apr_threadattr_create(&thread_attr, pchild);
+ apr_threadattr_create(&thread_attr, pconf);
/* 0 means PTHREAD_CREATE_JOINABLE */
apr_threadattr_detach_set(thread_attr, 0);
@@ -2821,7 +2821,7 @@ static void child_main(int child_num_arg, int chil
ts->threadattr = thread_attr;
rv = apr_thread_create(&start_thread_id, thread_attr, start_threads,
- ts, pchild);
+ ts, pconf);
if (rv != APR_SUCCESS) {
ap_log_error(APLOG_MARK, APLOG_ALERT, rv, ap_server_conf, APLOGNO(00480)
"apr_thread_create: unable to create worker thread");
Index: server/mpm/motorz/motorz.c
===================================================================
--- server/mpm/motorz/motorz.c (revision 1866998)
+++ server/mpm/motorz/motorz.c (working copy)
@@ -812,7 +812,7 @@ static void child_main(motorz_core_t *mz, int chil
ap_run_child_init(pchild, ap_server_conf);
- ap_create_sb_handle(&sbh, pchild, my_child_num, 0);
+ ap_create_sb_handle(&sbh, pconf, my_child_num, 0);
ap_update_child_status(sbh, SERVER_READY, NULL);
Index: server/mpm/prefork/prefork.c
===================================================================
--- server/mpm/prefork/prefork.c (revision 1866998)
+++ server/mpm/prefork/prefork.c (working copy)
@@ -414,7 +414,7 @@ static void child_main(int child_num_arg, int chil
#if APR_HAS_THREADS
osthd = apr_os_thread_current();
- apr_os_thread_put(&thd, &osthd, pchild);
+ apr_os_thread_put(&thd, &osthd, pconf);
#endif
apr_pool_create(&ptrans, pchild);
@@ -429,10 +429,10 @@ static void child_main(int child_num_arg, int chil
}
/* needs to be done before we switch UIDs so we have permissions */
- ap_reopen_scoreboard(pchild, NULL, 0);
+ ap_reopen_scoreboard(pconf, NULL, 0);
status = SAFE_ACCEPT(apr_proc_mutex_child_init(&my_bucket->mutex,
apr_proc_mutex_lockfile(my_bucket->mutex),
- pchild));
+ pconf));
if (status != APR_SUCCESS) {
lockfile = apr_proc_mutex_lockfile(my_bucket->mutex);
ap_log_error(APLOG_MARK, APLOG_EMERG, status, ap_server_conf, APLOGNO(00155)
@@ -443,18 +443,18 @@ static void child_main(int child_num_arg, int chil
clean_child_exit(APEXIT_CHILDFATAL);
}
- if (ap_run_drop_privileges(pchild, ap_server_conf)) {
+ if (ap_run_drop_privileges(pconf, ap_server_conf)) {
clean_child_exit(APEXIT_CHILDFATAL);
}
ap_run_child_init(pchild, ap_server_conf);
- ap_create_sb_handle(&sbh, pchild, my_child_num, 0);
+ ap_create_sb_handle(&sbh, pconf, my_child_num, 0);
(void) ap_update_child_status(sbh, SERVER_READY, (request_rec *) NULL);
/* Set up the pollfd array */
- status = apr_pollset_create(&pollset, num_listensocks, pchild,
+ status = apr_pollset_create(&pollset, num_listensocks, pconf,
APR_POLLSET_NOCOPY);
if (status != APR_SUCCESS) {
ap_log_error(APLOG_MARK, APLOG_EMERG, status, ap_server_conf, APLOGNO(00156)
@@ -463,7 +463,7 @@ static void child_main(int child_num_arg, int chil
}
for (lr = my_bucket->listeners, i = num_listensocks; i--; lr = lr->next) {
- apr_pollfd_t *pfd = apr_pcalloc(pchild, sizeof *pfd);
+ apr_pollfd_t *pfd = apr_pcalloc(pconf, sizeof *pfd);
pfd->desc_type = APR_POLL_SOCKET;
pfd->desc.s = lr->sd;
@@ -489,7 +489,7 @@ static void child_main(int child_num_arg, int chil
retained->mpm->mpm_state = AP_MPMQ_RUNNING;
- bucket_alloc = apr_bucket_alloc_create(pchild);
+ bucket_alloc = apr_bucket_alloc_create(pconf);
/* die_now is set when AP_SIG_GRACEFUL is received in the child;
* {shutdown,restart}_pending are set when a signal is received while
Index: server/mpm/simple/simple_children.c
===================================================================
--- server/mpm/simple/simple_children.c (revision 1866998)
+++ server/mpm/simple/simple_children.c (working copy)
@@ -54,7 +54,7 @@ static void simple_kill_random_child(simple_core_t
static void clean_child_exit(int code) __attribute__ ((noreturn));
static void clean_child_exit(int code)
{
- /* TODO: Pool cleanups.... sigh. */
+ /* pchild created/destroyed by simple_child_loop() */
exit(code);
}
Index: server/mpm/simple/simple_run.c
===================================================================
--- server/mpm/simple/simple_run.c (revision 1866998)
+++ server/mpm/simple/simple_run.c (working copy)
@@ -279,6 +279,7 @@ static int simple_setup_pollcb(simple_core_t * sc)
int simple_child_loop(simple_core_t * sc)
{
apr_status_t rv;
+ apr_pool_t *pchild;
rv = simple_setup_pollcb(sc);
if (rv) {
@@ -310,9 +311,22 @@ int simple_child_loop(simple_core_t * sc)
return !OK;
}
- ap_run_child_init(sc->pool, ap_server_conf);
+ /* Get a sub context for global allocations in this child, so that
+ * we can have cleanups occur when the child exits.
+ */
+ rv = apr_pool_create(&pchild, sc->pool);
+ if (rv) {
+ ap_log_error(APLOG_MARK, APLOG_CRIT, rv, NULL, APLOGNO()
+ "simple_child_loop: creating pchild failed");
+ return !OK;
+ }
+ apr_pool_tag(pchild, "pchild");
+ ap_run_child_init(pchild, ap_server_conf);
- return simple_run_loop(sc);
+ rv = simple_run_loop(sc);
+
+ apr_pool_destroy(pchild);
+ return rv;
}
int simple_main_loop(simple_core_t * sc)
Index: server/mpm/worker/worker.c
===================================================================
--- server/mpm/worker/worker.c (revision 1866998)
+++ server/mpm/worker/worker.c (working copy)
@@ -1123,11 +1123,11 @@ static void child_main(int child_num_arg, int chil
}
/*stuff to do before we switch id's, so we have permissions.*/
- ap_reopen_scoreboard(pchild, NULL, 0);
+ ap_reopen_scoreboard(pconf, NULL, 0);
rv = SAFE_ACCEPT(apr_proc_mutex_child_init(&my_bucket->mutex,
apr_proc_mutex_lockfile(my_bucket->mutex),
- pchild));
+ pconf));
if (rv != APR_SUCCESS) {
ap_log_error(APLOG_MARK, APLOG_EMERG, rv, ap_server_conf, APLOGNO(00280)
"Couldn't initialize cross-process lock in child");
@@ -1135,7 +1135,7 @@ static void child_main(int child_num_arg, int chil
}
/* done with init critical section */
- if (ap_run_drop_privileges(pchild, ap_server_conf)) {
+ if (ap_run_drop_privileges(pconf, ap_server_conf)) {
clean_child_exit(APEXIT_CHILDFATAL);
}
@@ -1172,9 +1172,9 @@ static void child_main(int child_num_arg, int chil
*/
threads = (apr_thread_t **)ap_calloc(1,
sizeof(apr_thread_t *) * threads_per_child);
- ts = (thread_starter *)apr_palloc(pchild, sizeof(*ts));
+ ts = (thread_starter *)apr_palloc(pconf, sizeof(*ts));
- apr_threadattr_create(&thread_attr, pchild);
+ apr_threadattr_create(&thread_attr, pconf);
/* 0 means PTHREAD_CREATE_JOINABLE */
apr_threadattr_detach_set(thread_attr, 0);
@@ -1194,7 +1194,7 @@ static void child_main(int child_num_arg, int chil
ts->threadattr = thread_attr;
rv = apr_thread_create(&start_thread_id, thread_attr, start_threads,
- ts, pchild);
+ ts, pconf);
if (rv != APR_SUCCESS) {
ap_log_error(APLOG_MARK, APLOG_ALERT, rv, ap_server_conf, APLOGNO(00282)
"apr_thread_create: unable to create worker thread");