]> git.ipfire.org Git - thirdparty/make.git/commitdiff
[SV 51400] Only unblock fatal signals after child invocation
authorPaul Smith <psmith@gnu.org>
Sun, 9 Jul 2017 22:44:17 +0000 (18:44 -0400)
committerPaul Smith <psmith@gnu.org>
Mon, 10 Jul 2017 01:14:15 +0000 (21:14 -0400)
* job.c (unblock_sigs): Only unblock fatal signals not all signals.
(unblock_all_sigs): Unblock all signals not just fatal signals.
(child_execute_job): Call unblock_all_sigs() in child process.
* job.h: Remove unused function definitions.
* remote-cstms.c (start_remote_job): Call unblock_all_sigs() in
child process.
Reported by Koen Van Hoof <koen.van_hoof@nokia.com>

job.c
job.h
main.c
remote-cstms.c

diff --git a/job.c b/job.c
index e2f2273d3f0da2e1810d8573de6d3a145138d0f2..c35213a73cd3b29dd3207e515726ba98f5a895d4 100644 (file)
--- a/job.c
+++ b/job.c
@@ -464,6 +464,62 @@ is_bourne_compatible_shell (const char *path)
   return 0;
 }
 
+#ifdef POSIX
+extern sigset_t fatal_signal_set;
+
+static void
+block_sigs ()
+{
+  sigprocmask (SIG_BLOCK, &fatal_signal_set, (sigset_t *) 0);
+}
+
+static void
+unblock_sigs ()
+{
+  sigprocmask (SIG_UNBLOCK, &fatal_signal_set, (sigset_t *) 0);
+}
+
+void
+unblock_all_sigs ()
+{
+  sigset_t empty;
+  sigemptyset (&empty);
+  sigprocmask (SIG_SETMASK, &empty, (sigset_t *) 0);
+}
+
+#elif defined(HAVE_SIGSETMASK)
+
+extern int fatal_signal_mask;
+
+static void
+block_sigs ()
+{
+  sigblock (fatal_signal_mask);
+}
+
+static void
+unblock_sigs ()
+{
+  sigsetmask (siggetmask (0) & ~fatal_signal_mask)
+}
+
+void
+unblock_all_sigs ()
+{
+  sigsetmask (0);
+}
+
+#else
+
+#define block_sigs()
+#define unblock_sigs()
+
+void
+unblock_all_sigs ()
+{
+}
+
+#endif
 \f
 /* Write an error message describing the exit status given in
    EXIT_CODE, EXIT_SIG, and COREDUMP, for the target TARGET_NAME.
@@ -1037,32 +1093,6 @@ free_child (struct child *child)
   free (child);
 }
 \f
-#ifdef POSIX
-extern sigset_t fatal_signal_set;
-#endif
-
-void
-block_sigs (void)
-{
-#ifdef POSIX
-  (void) sigprocmask (SIG_BLOCK, &fatal_signal_set, (sigset_t *) 0);
-#else
-# ifdef HAVE_SIGSETMASK
-  (void) sigblock (fatal_signal_mask);
-# endif
-#endif
-}
-
-#ifdef POSIX
-void
-unblock_sigs (void)
-{
-  sigset_t empty;
-  sigemptyset (&empty);
-  sigprocmask (SIG_SETMASK, &empty, (sigset_t *) 0);
-}
-#endif
-
 
 /* Start a job to run the commands specified in CHILD.
    CHILD is updated to reflect the commands and ID of the child process.
@@ -2144,7 +2174,7 @@ child_execute_job (struct output *out, int good_stdin, char **argv, char **envp)
     return pid;
 
   /* We are the child.  */
-  unblock_sigs ();
+  unblock_all_sigs ();
 
 #ifdef SET_STACK_SIZE
   /* Reset limits, if necessary.  */
diff --git a/job.h b/job.h
index 9bea9a728cc3251cc3ad52f95043af276f7f6565..a8677bf36bf2272993e2f5d0fe3ec9c5e3a05e8c 100644 (file)
--- a/job.h
+++ b/job.h
@@ -73,18 +73,7 @@ int exec_command (char **argv, char **envp);
 void exec_command (char **argv, char **envp) __attribute__ ((noreturn));
 #endif
 
-extern unsigned int job_slots_used;
-
-void block_sigs (void);
-#ifdef POSIX
-void unblock_sigs (void);
-#else
-#ifdef  HAVE_SIGSETMASK
-extern int fatal_signal_mask;
-#define unblock_sigs()  sigsetmask (0)
-#else
-#define unblock_sigs()
-#endif
-#endif
+void unblock_all_sigs (void);
 
+extern unsigned int job_slots_used;
 extern unsigned int jobserver_tokens;
diff --git a/main.c b/main.c
index 939a1577433817620d297c7cc0bb801e4b5a53a7..4079da229abe385cc2ce5f76d877613f2fdab3aa 100644 (file)
--- a/main.c
+++ b/main.c
@@ -582,12 +582,10 @@ struct output make_sync;
 \f
 /* Mask of signals that are being caught with fatal_error_signal.  */
 
-#ifdef POSIX
+#if defined(POSIX)
 sigset_t fatal_signal_set;
-#else
-# ifdef HAVE_SIGSETMASK
+#elif defined(HAVE_SIGSETMASK)
 int fatal_signal_mask;
-# endif
 #endif
 
 #if !HAVE_DECL_BSD_SIGNAL && !defined bsd_signal
index 7c36b9dcbefb124ca5fcf23bb86f77c7ec502e10..894b17942486d2208025d48f1abfc34c780f9ffd 100644 (file)
@@ -246,7 +246,7 @@ start_remote_job (char **argv, char **envp, int stdin_fd,
         (void) dup2 (stdin_fd, 0);
 
       /* Unblock signals in the child.  */
-      unblock_sigs ();
+      unblock_all_sigs ();
 
       /* Run the command.  */
       exec_command (new_argv, envp);