You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by yl...@apache.org on 2017/10/13 08:03:22 UTC

svn commit: r1812077 - in /httpd/httpd: branches/2.4.x/STATUS patches/2.4.x/stop_signals-PR61558.patch

Author: ylavic
Date: Fri Oct 13 08:03:21 2017
New Revision: 1812077

URL: http://svn.apache.org/viewvc?rev=1812077&view=rev
Log:
Propose.

Added:
    httpd/httpd/patches/2.4.x/stop_signals-PR61558.patch
Modified:
    httpd/httpd/branches/2.4.x/STATUS

Modified: httpd/httpd/branches/2.4.x/STATUS
URL: http://svn.apache.org/viewvc/httpd/httpd/branches/2.4.x/STATUS?rev=1812077&r1=1812076&r2=1812077&view=diff
==============================================================================
--- httpd/httpd/branches/2.4.x/STATUS (original)
+++ httpd/httpd/branches/2.4.x/STATUS Fri Oct 13 08:03:21 2017
@@ -220,6 +220,14 @@ PATCHES PROPOSED TO BACKPORT FROM TRUNK:
                    (merge with alterations for mmn etc.)
       +1: icing, ylavic
 
+   *) core: A signal received while stopping could have crashed the main
+      process.  PR 61558.
+      trunk patch: svn merge -c 1809881,1809973,1809976,1812075 ^/httpd/httpd/trunk .
+      2.4.x patch: https://svn.apache.org/repos/asf/httpd/httpd/patches/2.4.x/stop_signals-PR61558.patch
+                   (merge without changes to motorz)
+      +1: ylavic,
+ 
+
 
 PATCHES/ISSUES THAT ARE BEING WORKED
   [ New entries should be added at the START of the list ]

Added: httpd/httpd/patches/2.4.x/stop_signals-PR61558.patch
URL: http://svn.apache.org/viewvc/httpd/httpd/patches/2.4.x/stop_signals-PR61558.patch?rev=1812077&view=auto
==============================================================================
--- httpd/httpd/patches/2.4.x/stop_signals-PR61558.patch (added)
+++ httpd/httpd/patches/2.4.x/stop_signals-PR61558.patch Fri Oct 13 08:03:21 2017
@@ -0,0 +1,239 @@
+Index: CHANGES
+===================================================================
+--- CHANGES	(revision 1812075)
++++ CHANGES	(working copy)
+@@ -1,6 +1,9 @@
+                                                          -*- coding: utf-8 -*-
+ Changes with Apache 2.4.29
+ 
++  *) core: A signal received while stopping could have crashed the main
++     process.  PR 61558.  [Yann Ylavic]
++
+   *) mod_proxy: Fix regression for non decimal loadfactor parameter introduced
+      in 2.4.28.  [Jim Jagielski]
+ 
+Index: os/unix/unixd.c
+===================================================================
+--- os/unix/unixd.c	(revision 1812075)
++++ os/unix/unixd.c	(working copy)
+@@ -437,11 +437,19 @@ AP_DECLARE(apr_status_t) ap_unixd_accept(void **ac
+ /* 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_
+ 
+ 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
+@@ -481,6 +497,10 @@ static void sig_restart(int sig)
+ 
+ static apr_status_t unset_signals(void *unused)
+ {
++    if (!retained_data) {
++        /* Main process (ap_pglobal) is dying */
++        return APR_SUCCESS;
++    }
+     retained_data->shutdown_pending = retained_data->restart_pending = 0;
+     retained_data->was_graceful = !retained_data->is_ungraceful;
+     retained_data->is_ungraceful = 0;
+@@ -494,6 +514,10 @@ AP_DECLARE(void) ap_unixd_mpm_set_signals(apr_pool
+     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();
+ 
+Index: server/main.c
+===================================================================
+--- server/main.c	(revision 1812075)
++++ server/main.c	(working copy)
+@@ -273,6 +273,30 @@ static int abort_on_oom(int retcode)
+     return retcode; /* unreachable, hopefully. */
+ }
+ 
++/* Deregister all hooks when clearing pconf (pre_cleanup).
++ * TODO: have a hook to deregister and run them from here?
++ *       ap_clear_auth_internal() is already a candidate.
++ */
++static apr_status_t deregister_all_hooks(void *unused)
++{
++    (void)unused;
++    ap_clear_auth_internal();
++    apr_hook_deregister_all();
++    return APR_SUCCESS;
++}
++
++static void reset_process_pconf(process_rec *process)
++{
++    if (process->pconf) {
++        apr_pool_clear(process->pconf);
++    }
++    else {
++        apr_pool_create(&process->pconf, process->pool);
++        apr_pool_tag(process->pconf, "pconf");
++    }
++    apr_pool_pre_cleanup_register(process->pconf, NULL, deregister_all_hooks);
++}
++
+ static process_rec *init_process(int *argc, const char * const * *argv)
+ {
+     process_rec *process;
+@@ -317,8 +341,9 @@ static process_rec *init_process(int *argc, const
+     process = apr_palloc(cntx, sizeof(process_rec));
+     process->pool = cntx;
+ 
+-    apr_pool_create(&process->pconf, process->pool);
+-    apr_pool_tag(process->pconf, "pconf");
++    process->pconf = NULL;
++    reset_process_pconf(process);
++
+     process->argc = *argc;
+     process->argv = *argv;
+     process->short_name = apr_filepath_name_get((*argv)[0]);
+@@ -721,9 +746,7 @@ int main(int argc, const char * const argv[])
+ 
+     do {
+         ap_main_state = AP_SQ_MS_DESTROY_CONFIG;
+-        apr_hook_deregister_all();
+-        apr_pool_clear(pconf);
+-        ap_clear_auth_internal();
++        reset_process_pconf(process);
+ 
+         ap_main_state = AP_SQ_MS_CREATE_CONFIG;
+         ap_config_generation++;
+Index: server/mpm/event/event.c
+===================================================================
+--- server/mpm/event/event.c	(revision 1812075)
++++ server/mpm/event/event.c	(working copy)
+@@ -2880,9 +2880,6 @@ static int event_run(apr_pool_t * _pconf, apr_pool
+         ap_scoreboard_image->global->running_generation = retained->mpm->my_generation;
+     }
+ 
+-    if (!one_process) {
+-        ap_fatal_signal_setup(ap_server_conf, pconf);
+-    }
+     ap_unixd_mpm_set_signals(pconf, one_process);
+ 
+     /* Don't thrash since num_buckets depends on the
+Index: server/mpm/prefork/prefork.c
+===================================================================
+--- server/mpm/prefork/prefork.c	(revision 1812075)
++++ server/mpm/prefork/prefork.c	(working copy)
+@@ -863,9 +863,6 @@ static int prefork_run(apr_pool_t *_pconf, apr_poo
+         ap_scoreboard_image->global->running_generation = retained->mpm->my_generation;
+     }
+ 
+-    if (!one_process) {
+-        ap_fatal_signal_setup(ap_server_conf, pconf);
+-    }
+     ap_unixd_mpm_set_signals(pconf, one_process);
+ 
+     if (one_process) {
+Index: server/mpm/worker/worker.c
+===================================================================
+--- server/mpm/worker/worker.c	(revision 1812075)
++++ server/mpm/worker/worker.c	(working copy)
+@@ -1671,9 +1671,6 @@ static int worker_run(apr_pool_t *_pconf, apr_pool
+         ap_scoreboard_image->global->running_generation = retained->mpm->my_generation;
+     }
+ 
+-    if (!one_process) {
+-        ap_fatal_signal_setup(ap_server_conf, pconf);
+-    }
+     ap_unixd_mpm_set_signals(pconf, one_process);
+ 
+     /* Don't thrash since num_buckets depends on the
+Index: server/mpm_unix.c
+===================================================================
+--- server/mpm_unix.c	(revision 1812075)
++++ server/mpm_unix.c	(working copy)
+@@ -1009,6 +1009,33 @@ AP_DECLARE(apr_status_t) ap_fatal_signal_child_set
+     return APR_SUCCESS;
+ }
+ 
++/* We can't call sig_coredump (ap_log_error) once pconf is destroyed, so
++ * avoid double faults by restoring each default signal handler on cleanup.
++ */
++static apr_status_t fatal_signal_cleanup(void *unused)
++{
++    (void)unused;
++
++    apr_signal(SIGSEGV, SIG_DFL);
++#ifdef SIGBUS
++    apr_signal(SIGBUS, SIG_DFL);
++#endif /* SIGBUS */
++#ifdef SIGABORT
++    apr_signal(SIGABORT, SIG_DFL);
++#endif /* SIGABORT */
++#ifdef SIGABRT
++    apr_signal(SIGABRT, SIG_DFL);
++#endif /* SIGABRT */
++#ifdef SIGILL
++    apr_signal(SIGILL, SIG_DFL);
++#endif /* SIGILL */
++#ifdef SIGFPE
++    apr_signal(SIGFPE, SIG_DFL);
++#endif /* SIGFPE */
++
++    return APR_SUCCESS;
++}
++
+ AP_DECLARE(apr_status_t) ap_fatal_signal_setup(server_rec *s,
+                                                apr_pool_t *in_pconf)
+ {
+@@ -1071,6 +1098,8 @@ AP_DECLARE(apr_status_t) ap_fatal_signal_setup(ser
+ 
+     pconf = in_pconf;
+     parent_pid = my_pid = getpid();
++    apr_pool_cleanup_register(pconf, NULL, fatal_signal_cleanup,
++                              fatal_signal_cleanup);
+ 
+     return APR_SUCCESS;
+ }
+Index: .
+===================================================================
+--- .	(revision 1812075)
++++ .	(working copy)
+
+Property changes on: .
+___________________________________________________________________
+Modified: svn:mergeinfo
+## -0,0 +0,1 ##
+   Merged /httpd/httpd/trunk:r1809881,1809973,1809976,1812075