summaryrefslogtreecommitdiff
path: root/os
diff options
context:
space:
mode:
authorYann Ylavic <ylavic@apache.org>2017-09-28 11:08:09 +0000
committerYann Ylavic <ylavic@apache.org>2017-09-28 11:08:09 +0000
commita16360a61f035c60b93e11ab8578c02a570fcec3 (patch)
tree3885105f26238166244cb7d0e13c986c2c0f209a /os
parent13ceec01048b2fd00cbc5372407d760987f94e35 (diff)
downloadhttpd-a16360a61f035c60b93e11ab8578c02a570fcec3.tar.gz
core, MPMs unix: follow up to r1809881.
Deregister all hooks first (in pre_cleanup), by doing it last we could still have had them run when DSOs were unloaded. Likewise, avoid double faults when handling fatal signals by restoring the default handler before pconf is cleared (we can't ap_log_error there). Finally, we need to ignore sig_term/restart (do nothing) when the main process is exiting (i.e. ap_pglobal is destroyed), since retained_data are freed. Aimed to fix all faults in PR 61558. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1809973 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'os')
-rw-r--r--os/unix/unixd.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/os/unix/unixd.c b/os/unix/unixd.c
index 07a9bef754..b17b6ac2e3 100644
--- a/os/unix/unixd.c
+++ b/os/unix/unixd.c
@@ -437,11 +437,19 @@ AP_DECLARE(apr_status_t) ap_unixd_accept(void **accepted, ap_listen_rec *lr,
/* Unixes MPMs' */
static ap_unixd_mpm_retained_data *retained_data = NULL;
+static apr_status_t retained_data_cleanup(void *unused)
+{
+ (void)unused;
+ retained_data = NULL;
+ return APR_SUCCESS;
+}
+
AP_DECLARE(ap_unixd_mpm_retained_data *) ap_unixd_mpm_get_retained_data()
{
if (!retained_data) {
retained_data = ap_retained_data_create("ap_unixd_mpm_retained_data",
sizeof(*retained_data));
+ apr_pool_pre_cleanup_register(ap_pglobal, NULL, retained_data_cleanup);
retained_data->mpm_state = AP_MPMQ_STARTING;
}
return retained_data;
@@ -449,6 +457,10 @@ AP_DECLARE(ap_unixd_mpm_retained_data *) ap_unixd_mpm_get_retained_data()
static void sig_term(int sig)
{
+ if (!retained_data) {
+ /* Main process (ap_pglobal) is dying */
+ return;
+ }
retained_data->mpm_state = AP_MPMQ_STOPPING;
if (retained_data->shutdown_pending
&& (retained_data->is_ungraceful
@@ -465,6 +477,10 @@ static void sig_term(int sig)
static void sig_restart(int sig)
{
+ if (!retained_data) {
+ /* Main process (ap_pglobal) is dying */
+ return;
+ }
retained_data->mpm_state = AP_MPMQ_STOPPING;
if (retained_data->restart_pending
&& (retained_data->is_ungraceful
@@ -494,6 +510,10 @@ AP_DECLARE(void) ap_unixd_mpm_set_signals(apr_pool_t *pconf, int one_process)
struct sigaction sa;
#endif
+ if (!one_process) {
+ ap_fatal_signal_setup(ap_server_conf, pconf);
+ }
+
/* Signals' handlers depend on retained data */
(void)ap_unixd_mpm_get_retained_data();