From: Yann Ylavic Date: Thu, 18 Jan 2018 14:47:41 +0000 (+0000) Subject: mpm_{event,worker}: Mask signals for threads created by modules in child init. X-Git-Tag: 2.5.0-alpha2-ci-test-only~2966 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=85ed30bd145e02b9c02deca16473e103b40de13d;p=thirdparty%2Fapache%2Fhttpd.git mpm_{event,worker}: Mask signals for threads created by modules in child init. PR 62009, so that they don't receive (implicitely) the ones meant for the MPM. Inspired by: Armin Abfalterer Proposed by: Yann Ylavic git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1821504 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/CHANGES b/CHANGES index 910cb3ab44d..6ad4d2a8805 100644 --- a/CHANGES +++ b/CHANGES @@ -1,6 +1,10 @@ -*- coding: utf-8 -*- Changes with Apache 2.5.1 + *) mpm_event,worker: Mask signals for threads created by modules in child + init, so that they don't receive (implicitely) the ones meant for the MPM. + PR 62009. [Armin Abfalterer , Yann Ylavic] + *) mpm_event: Update scoreboard status for KeepAlive state. [Yann Ylavic] *) core, mpm_event: Avoid a small memory leak of the scoreboard handle, for diff --git a/server/mpm/event/event.c b/server/mpm/event/event.c index 6ccc2084454..783dfabf0be 100644 --- a/server/mpm/event/event.c +++ b/server/mpm/event/event.c @@ -2663,6 +2663,7 @@ static void child_main(int child_num_arg, int child_bucket) /*stuff to do before we switch id's, so we have permissions. */ ap_reopen_scoreboard(pchild, NULL, 0); + /* done with init critical section */ if (ap_run_drop_privileges(pchild, ap_server_conf)) { clean_child_exit(APEXIT_CHILDFATAL); } @@ -2672,9 +2673,6 @@ static void child_main(int child_num_arg, int child_bucket) apr_pool_create(&pskip, pchild); apr_skiplist_init(&timer_skiplist, pskip); apr_skiplist_set_compare(timer_skiplist, timer_comp, timer_comp); - ap_run_child_init(pchild, ap_server_conf); - - /* done with init critical section */ /* Just use the standard apr_setup_signal_thread to block all signals * from being received. The child processes no longer use signals for @@ -2687,6 +2685,8 @@ static void child_main(int child_num_arg, int child_bucket) clean_child_exit(APEXIT_CHILDFATAL); } + ap_run_child_init(pchild, ap_server_conf); + if (ap_max_requests_per_child) { conns_this_child = ap_max_requests_per_child; } diff --git a/server/mpm/worker/worker.c b/server/mpm/worker/worker.c index 9a971ebd576..9d72f90a467 100644 --- a/server/mpm/worker/worker.c +++ b/server/mpm/worker/worker.c @@ -1112,17 +1112,16 @@ static void child_main(int child_num_arg, int child_bucket) clean_child_exit(APEXIT_CHILDFATAL); } + /* done with init critical section */ if (ap_run_drop_privileges(pchild, ap_server_conf)) { clean_child_exit(APEXIT_CHILDFATAL); } - ap_run_child_init(pchild, ap_server_conf); - - /* done with init critical section */ - /* Just use the standard apr_setup_signal_thread to block all signals * from being received. The child processes no longer use signals for - * any communication with the parent process. + * any communication with the parent process. Let's also do this before + * child_init() hooks are called and possibly create threads that + * otherwise could "steal" (implicitely) MPM's signals. */ rv = apr_setup_signal_thread(); if (rv != APR_SUCCESS) { @@ -1131,6 +1130,8 @@ static void child_main(int child_num_arg, int child_bucket) clean_child_exit(APEXIT_CHILDFATAL); } + ap_run_child_init(pchild, ap_server_conf); + if (ap_max_requests_per_child) { requests_this_child = ap_max_requests_per_child; }