diff options
-rw-r--r-- | shell/ash.c | 5 |
1 files changed, 4 insertions, 1 deletions
diff --git a/shell/ash.c b/shell/ash.c index 597bc2808..47f968b54 100644 --- a/shell/ash.c +++ b/shell/ash.c | |||
@@ -4525,7 +4525,7 @@ clear_traps(void) | |||
4525 | INT_OFF; | 4525 | INT_OFF; |
4526 | free(*tp); | 4526 | free(*tp); |
4527 | *tp = NULL; | 4527 | *tp = NULL; |
4528 | if (tp != &trap[0]) | 4528 | if ((tp - trap) != 0) |
4529 | setsignal(tp - trap); | 4529 | setsignal(tp - trap); |
4530 | INT_ON; | 4530 | INT_ON; |
4531 | } | 4531 | } |
@@ -4596,6 +4596,8 @@ forkchild(struct job *jp, union node *n, int mode) | |||
4596 | * | 4596 | * |
4597 | * Our solution: ONLY bare $(trap) or `trap` is special. | 4597 | * Our solution: ONLY bare $(trap) or `trap` is special. |
4598 | */ | 4598 | */ |
4599 | free(trap[0]); /* Prevent EXIT trap from firing in `trap` */ | ||
4600 | trap[0] = NULL; | ||
4599 | } else { | 4601 | } else { |
4600 | clear_traps(); | 4602 | clear_traps(); |
4601 | } | 4603 | } |
@@ -13023,6 +13025,7 @@ exitshell(void) | |||
13023 | if (p) { | 13025 | if (p) { |
13024 | trap[0] = NULL; | 13026 | trap[0] = NULL; |
13025 | evalstring(p, 0); | 13027 | evalstring(p, 0); |
13028 | free(p); | ||
13026 | } | 13029 | } |
13027 | flush_stdout_stderr(); | 13030 | flush_stdout_stderr(); |
13028 | out: | 13031 | out: |