ash: partially sync with dash on "fork if traps are set" logic
authorDenys Vlasenko <vda.linux@googlemail.com>
Thu, 27 Oct 2016 10:55:09 +0000 (12:55 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Thu, 27 Oct 2016 10:55:09 +0000 (12:55 +0200)
Upstream commit "[EVAL] Force fork if any trap is set, not just on EXIT"
had a similar code as our fix to that bug.
Eliminate some superficial differences.

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
shell/ash.c

index 0dd440c61a630d0bf613e22f98883ce66e9bfd78..c575e10368ed7b96d28b5e8f1fe0bc786d98786d 100644 (file)
@@ -4660,19 +4660,19 @@ clear_traps(void)
 {
        char **tp;
 
+       INT_OFF;
        for (tp = trap; tp < &trap[NSIG]; tp++) {
                if (*tp && **tp) {      /* trap not NULL or "" (SIG_IGN) */
-                       INT_OFF;
                        if (trap_ptr == trap)
                                free(*tp);
                        /* else: it "belongs" to trap_ptr vector, don't free */
                        *tp = NULL;
                        if ((tp - trap) != 0)
                                setsignal(tp - trap);
-                       INT_ON;
                }
        }
        may_have_traps = 0;
+       INT_ON;
 }
 
 /* Lives far away from here, needed for forkchild */
@@ -12753,12 +12753,13 @@ trapcmd(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
                if (action) {
                        if (LONE_DASH(action))
                                action = NULL;
-                       else
+                       else {
+                               if (action[0]) /* not NULL and not "" and not "-" */
+                                       may_have_traps = 1;
                                action = ckstrdup(action);
+                       }
                }
                free(trap[signo]);
-               if (action)
-                       may_have_traps = 1;
                trap[signo] = action;
                if (signo != 0)
                        setsignal(signo);