From aee4053141740c3fddf42c14eb5ee52302ed271b Mon Sep 17 00:00:00 2001
From: Eric Wong <e@80x24.org>
Date: Tue, 31 May 2016 00:44:12 +0000
Subject: [PATCH] process.c (disable_child_handler_fork_child): simplify

signal(2) is portable for SIG_DFL and SIG_IGN, so we do not
need the extra code for sigaction(2).

Also, execve will reset all signal handlers to default
anyways, so there is little sense in preserving old
signal handler besides SIG_IGN.

Hopefully this makes the code easier-to-understand and
maintain.
---
 process.c | 61 +++++++++----------------------------------------------------
 1 file changed, 9 insertions(+), 52 deletions(-)

diff --git a/process.c b/process.c
index fa4f020..2938b9f 100644
--- a/process.c
+++ b/process.c
@@ -3497,44 +3497,10 @@ disable_child_handler_fork_child(struct child_handler_disabler_state *old, char
 {
     int sig;
     int ret;
-#ifdef POSIX_SIGNAL
-    struct sigaction act, oact;
-
-    act.sa_handler = SIG_DFL;
-    act.sa_flags = 0;
-    ret = sigemptyset(&act.sa_mask); /* async-signal-safe */
-    if (ret == -1) {
-        ERRMSG("sigemptyset");
-        return -1;
-    }
-#else
-    sig_t handler;
-#endif
 
     for (sig = 1; sig < NSIG; sig++) {
-        int reset = 0;
-#ifdef SIGPIPE
-        if (sig == SIGPIPE) {
-            reset = 1;
-#ifndef POSIX_SIGNAL
-            handler = SIG_DFL;
-#endif
-	}
-#endif
-        if (!reset) {
-#ifdef POSIX_SIGNAL
-            ret = sigaction(sig, NULL, &oact); /* async-signal-safe */
-            if (ret == -1 && errno == EINVAL) {
-                continue; /* Ignore invalid signal number. */
-            }
-            if (ret == -1) {
-                ERRMSG("sigaction to obtain old action");
-                return -1;
-            }
-            reset = (oact.sa_flags & SA_SIGINFO) ||
-                    (oact.sa_handler != SIG_IGN && oact.sa_handler != SIG_DFL);
-#else
-            handler = signal(sig, SIG_DFL);
+            sig_t handler = signal(sig, SIG_DFL);
+
             if (handler == SIG_ERR && errno == EINVAL) {
                 continue; /* Ignore invalid signal number */
             }
@@ -3542,24 +3508,15 @@ disable_child_handler_fork_child(struct child_handler_disabler_state *old, char
                 ERRMSG("signal to obtain old action");
                 return -1;
             }
-            reset = (handler != SIG_IGN && handler != SIG_DFL);
-#endif
-        }
-        if (reset) {
-#ifdef POSIX_SIGNAL
-            ret = sigaction(sig, &act, NULL); /* async-signal-safe */
-            if (ret == -1) {
-                ERRMSG("sigaction to set default action");
-                return -1;
+#ifdef SIGPIPE
+            if (sig == SIGPIPE) {
+                continue;
             }
-#else
-           handler = signal(sig, handler);
-           if (handler == SIG_ERR) {
-                ERRMSG("signal to set default action");
-                return -1;
-           }
 #endif
-        }
+            /* it will be reset to SIG_DFL at execve time, instead */
+            if (handler == SIG_IGN) {
+                signal(sig, SIG_IGN);
+            }
     }
 
     ret = sigprocmask(SIG_SETMASK, &old->sigmask, NULL); /* async-signal-safe */
