hush: fix EXIT trap display inside exit trap handler
No binary (build failed)
—
(log yok)
| @@ -1357,10 +1357,10 @@ static void hush_exit(int exitcode) | |
| /* argv[0] is unused */ | |
| argv[1] = G.traps[0]; | |
| argv[2] = NULL; | |
| - | G.traps[0] = NULL; |
| - | G.exiting = 1; |
| + | G.exiting = 1; /* prevent EXIT trap recursion */ |
| builtin_eval(argv); | |
| - | /* free(argv[1]); - why bother */ |
| + | /* Note: G.traps[0] is not cleared! |
| + | * "trap" will still show it */ |
| } | |
| #if ENABLE_HUSH_JOB | |
| @@ -7864,7 +7864,7 @@ static int FAST_FUNC builtin_exit(char **argv) | |
| * exit | |
| # EEE (then bash exits) | |
| * | |
| - | * we can use G.exiting = -1 as indicator "last cmd was exit" |
| + | * TODO: we can use G.exiting = -1 as indicator "last cmd was exit" |
| */ | |
| /* note: EXIT trap is run by hush_exit */ | |
| @@ -1,2 +1,12 @@ | |
| cow | |
| moo | |
| + | Traps1: |
| + | trap -- 'exitfunc' EXIT |
| + | Traps2: |
| + | trap -- 'echo Should not run' EXIT |
| + | Check1: 42 |
| + | Traps1: |
| + | trap -- 'exitfunc' EXIT |
| + | Traps2: |
| + | trap -- 'echo Should not run' EXIT |
| + | Check2: 42 |
| @@ -1,3 +1,34 @@ | |
| "$THIS_SH" -c 'trap "echo cow" 0' | |
| "$THIS_SH" -c 'trap "echo moo" EXIT' | |
| "$THIS_SH" -c 'trap "echo no" 0; trap 0' | |
| + | |
| + | ( |
| + | exitfunc() { |
| + | echo "Traps1:" |
| + | trap |
| + | # EXIT trap is disabled after it is triggered, |
| + | # it can not be "re-armed" like this: |
| + | trap "echo Should not run" EXIT |
| + | echo "Traps2:" |
| + | trap |
| + | } |
| + | trap 'exitfunc' EXIT |
| + | exit 42 |
| + | ) |
| + | echo Check1: $? |
| + | |
| + | ( |
| + | exitfunc() { |
| + | echo "Traps1:" |
| + | trap |
| + | # EXIT trap is disabled after it is triggered, |
| + | # it can not be "re-armed" like this: |
| + | trap "echo Should not run" EXIT |
| + | echo "Traps2:" |
| + | trap |
| + | exit 42 |
| + | } |
| + | trap 'exitfunc' EXIT |
| + | exit 66 |
| + | ) |
| + | echo Check2: $? |