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>
This commit is contained in:
Denys Vlasenko 2016-10-27 12:55:09 +02:00
parent 2eb0a7e1b9
commit b4f51d32d2

View File

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