diff options
author | Denys Vlasenko | 2016-10-27 12:55:09 +0200 |
---|---|---|
committer | Denys Vlasenko | 2016-10-27 12:55:09 +0200 |
commit | b4f51d32d288a985019884d79515b1d7a8251529 (patch) | |
tree | e39a0f9e90805e62998d8aedef3165eea5f950a1 /shell/ash.c | |
parent | 2eb0a7e1b9a579ba34e4780c9ed8e74f38bc6b85 (diff) | |
download | busybox-b4f51d32d288a985019884d79515b1d7a8251529.zip busybox-b4f51d32d288a985019884d79515b1d7a8251529.tar.gz |
ash: partially sync with dash on "fork if traps are set" logic
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>
Diffstat (limited to 'shell/ash.c')
-rw-r--r-- | shell/ash.c | 11 |
1 files changed, 6 insertions, 5 deletions
diff --git a/shell/ash.c b/shell/ash.c index 0dd440c..c575e10 100644 --- a/shell/ash.c +++ b/shell/ash.c @@ -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); |