aboutsummaryrefslogtreecommitdiff
path: root/shell/ash.c
diff options
context:
space:
mode:
Diffstat (limited to 'shell/ash.c')
-rw-r--r--shell/ash.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/shell/ash.c b/shell/ash.c
index b30dc7728..37bdc701a 100644
--- a/shell/ash.c
+++ b/shell/ash.c
@@ -4526,7 +4526,9 @@ clear_traps(void)
for (tp = trap; tp < &trap[NSIG]; tp++) {
if (*tp && **tp) { /* trap not NULL or "" (SIG_IGN) */
INT_OFF;
- free(*tp);
+ 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);
@@ -4602,10 +4604,8 @@ forkchild(struct job *jp, union node *n, int mode)
/* This is needed to prevent EXIT trap firing and such
* (trap_ptr will be freed in trapcmd()) */
trap_ptr = memcpy(xmalloc(sizeof(trap)), trap, sizeof(trap));
- memset(trap, 0, sizeof(trap));
- } else {
- clear_traps();
}
+ clear_traps();
#if JOBS
/* do job control only in root shell */
doing_jobctl = 0;