diff options
-rw-r--r-- | shell/hush.c | 8 | ||||
-rw-r--r-- | shell/hush_test/hush-trap/exit.right | 10 | ||||
-rwxr-xr-x | shell/hush_test/hush-trap/exit.tests | 31 |
3 files changed, 45 insertions, 4 deletions
diff --git a/shell/hush.c b/shell/hush.c index b01f90370..3ad87b19b 100644 --- a/shell/hush.c +++ b/shell/hush.c | |||
@@ -1357,10 +1357,10 @@ static void hush_exit(int exitcode) | |||
1357 | /* argv[0] is unused */ | 1357 | /* argv[0] is unused */ |
1358 | argv[1] = G.traps[0]; | 1358 | argv[1] = G.traps[0]; |
1359 | argv[2] = NULL; | 1359 | argv[2] = NULL; |
1360 | G.traps[0] = NULL; | 1360 | G.exiting = 1; /* prevent EXIT trap recursion */ |
1361 | G.exiting = 1; | ||
1362 | builtin_eval(argv); | 1361 | builtin_eval(argv); |
1363 | /* free(argv[1]); - why bother */ | 1362 | /* Note: G.traps[0] is not cleared! |
1363 | * "trap" will still show it */ | ||
1364 | } | 1364 | } |
1365 | 1365 | ||
1366 | #if ENABLE_HUSH_JOB | 1366 | #if ENABLE_HUSH_JOB |
@@ -7864,7 +7864,7 @@ static int FAST_FUNC builtin_exit(char **argv) | |||
7864 | * exit | 7864 | * exit |
7865 | # EEE (then bash exits) | 7865 | # EEE (then bash exits) |
7866 | * | 7866 | * |
7867 | * we can use G.exiting = -1 as indicator "last cmd was exit" | 7867 | * TODO: we can use G.exiting = -1 as indicator "last cmd was exit" |
7868 | */ | 7868 | */ |
7869 | 7869 | ||
7870 | /* note: EXIT trap is run by hush_exit */ | 7870 | /* note: EXIT trap is run by hush_exit */ |
diff --git a/shell/hush_test/hush-trap/exit.right b/shell/hush_test/hush-trap/exit.right index b4932fb7f..3d0072564 100644 --- a/shell/hush_test/hush-trap/exit.right +++ b/shell/hush_test/hush-trap/exit.right | |||
@@ -1,2 +1,12 @@ | |||
1 | cow | 1 | cow |
2 | moo | 2 | moo |
3 | Traps1: | ||
4 | trap -- 'exitfunc' EXIT | ||
5 | Traps2: | ||
6 | trap -- 'echo Should not run' EXIT | ||
7 | Check1: 42 | ||
8 | Traps1: | ||
9 | trap -- 'exitfunc' EXIT | ||
10 | Traps2: | ||
11 | trap -- 'echo Should not run' EXIT | ||
12 | Check2: 42 | ||
diff --git a/shell/hush_test/hush-trap/exit.tests b/shell/hush_test/hush-trap/exit.tests index 092543c25..2061105dd 100755 --- a/shell/hush_test/hush-trap/exit.tests +++ b/shell/hush_test/hush-trap/exit.tests | |||
@@ -1,3 +1,34 @@ | |||
1 | "$THIS_SH" -c 'trap "echo cow" 0' | 1 | "$THIS_SH" -c 'trap "echo cow" 0' |
2 | "$THIS_SH" -c 'trap "echo moo" EXIT' | 2 | "$THIS_SH" -c 'trap "echo moo" EXIT' |
3 | "$THIS_SH" -c 'trap "echo no" 0; trap 0' | 3 | "$THIS_SH" -c 'trap "echo no" 0; trap 0' |
4 | |||
5 | ( | ||
6 | exitfunc() { | ||
7 | echo "Traps1:" | ||
8 | trap | ||
9 | # EXIT trap is disabled after it is triggered, | ||
10 | # it can not be "re-armed" like this: | ||
11 | trap "echo Should not run" EXIT | ||
12 | echo "Traps2:" | ||
13 | trap | ||
14 | } | ||
15 | trap 'exitfunc' EXIT | ||
16 | exit 42 | ||
17 | ) | ||
18 | echo Check1: $? | ||
19 | |||
20 | ( | ||
21 | exitfunc() { | ||
22 | echo "Traps1:" | ||
23 | trap | ||
24 | # EXIT trap is disabled after it is triggered, | ||
25 | # it can not be "re-armed" like this: | ||
26 | trap "echo Should not run" EXIT | ||
27 | echo "Traps2:" | ||
28 | trap | ||
29 | exit 42 | ||
30 | } | ||
31 | trap 'exitfunc' EXIT | ||
32 | exit 66 | ||
33 | ) | ||
34 | echo Check2: $? | ||