]> git.ipfire.org Git - thirdparty/apache/httpd.git/commitdiff
prefork: Ignore SIGINT in child. This fixes race-condition in signals handling
authorJan Kaluža <jkaluza@apache.org>
Mon, 18 Aug 2014 07:43:43 +0000 (07:43 +0000)
committerJan Kaluža <jkaluza@apache.org>
Mon, 18 Aug 2014 07:43:43 +0000 (07:43 +0000)
when httpd is runnning on foreground and user hits ctrl+c. In this case, SIGINT
is sent to all children followed by SIGTERM from the main process, which
interrupts the SIGINT handler and leads to inconsistency (process freezes
or crashes).

git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1618555 13f79535-47bb-0310-9956-ffa450edef68

server/mpm/prefork/prefork.c

index 8790ec086ebfac2912a6887e01c7fb904525f355..d6c038bcee5b5c561f8210085c031a614717381f 100644 (file)
@@ -222,6 +222,9 @@ static void clean_child_exit(int code)
 {
     mpm_state = AP_MPMQ_STOPPING;
 
+    apr_signal(SIGHUP, SIG_IGN);
+    apr_signal(SIGTERM, SIG_IGN);
+
     if (pchild) {
         apr_pool_destroy(pchild);
     }
@@ -817,6 +820,13 @@ static int make_child(server_rec *s, int slot)
          */
         apr_signal(SIGHUP, just_die);
         apr_signal(SIGTERM, just_die);
+        /* Ignore SIGINT in child. This fixes race-condition in signals
+         * handling when httpd is runnning on foreground and user hits ctrl+c.
+         * In this case, SIGINT is sent to all children followed by SIGTERM
+         * from the main process, which interrupts the SIGINT handler and
+         * leads to inconsistency.
+         */
+        apr_signal(SIGINT, SIG_IGN);
         /* The child process just closes listeners on AP_SIG_GRACEFUL.
          * The pod is used for signalling the graceful restart.
          */