diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2020-02-21 02:55:53 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2020-02-21 02:55:53 +0100 |
commit | 3ced804e3118d138781c3e4baa6bf1589b9f2dfd (patch) | |
tree | 963276adb3280dfa605725e20598afe566139f08 /shell | |
parent | cc9ecd9af13f04a4814ebdec60942962c3e9f14f (diff) | |
download | busybox-3ced804e3118d138781c3e4baa6bf1589b9f2dfd.tar.gz |
hush: make "exit" in trap use pre-trap exitcode - fix for nested trap
function old new delta
check_and_run_traps 276 278 +2
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'shell')
-rw-r--r-- | shell/ash_test/ash-misc/exitcode_trap6.right | 2 | ||||
-rwxr-xr-x | shell/ash_test/ash-misc/exitcode_trap6.tests | 11 | ||||
-rw-r--r-- | shell/hush.c | 4 | ||||
-rw-r--r-- | shell/hush_test/hush-misc/exitcode_trap6.right | 2 | ||||
-rwxr-xr-x | shell/hush_test/hush-misc/exitcode_trap6.tests | 11 |
5 files changed, 29 insertions, 1 deletions
diff --git a/shell/ash_test/ash-misc/exitcode_trap6.right b/shell/ash_test/ash-misc/exitcode_trap6.right new file mode 100644 index 000000000..b76c1908e --- /dev/null +++ b/shell/ash_test/ash-misc/exitcode_trap6.right @@ -0,0 +1,2 @@ +INT +42:42 diff --git a/shell/ash_test/ash-misc/exitcode_trap6.tests b/shell/ash_test/ash-misc/exitcode_trap6.tests new file mode 100755 index 000000000..15fb99d2d --- /dev/null +++ b/shell/ash_test/ash-misc/exitcode_trap6.tests @@ -0,0 +1,11 @@ +# "exit" in trap should not use last command's exitcode, +# but exitcode on entering the trap. +# Nested trap should not interfere with this. +$THIS_SH -c ' + trap "echo INT" int + trap "kill -int $$;exit" term + kill $$ & + (exit 42) + wait +' +echo 42:$? diff --git a/shell/hush.c b/shell/hush.c index b881b001a..357a354e2 100644 --- a/shell/hush.c +++ b/shell/hush.c @@ -2107,16 +2107,18 @@ static int check_and_run_traps(void) if (G_traps[sig][0]) { /* We have user-defined handler */ smalluint save_rcode; + int save_pre; char *argv[3]; /* argv[0] is unused */ argv[1] = xstrdup(G_traps[sig]); /* why strdup? trap can modify itself: trap 'trap "echo oops" INT' INT */ argv[2] = NULL; + save_pre = G.pre_trap_exitcode; G.pre_trap_exitcode = save_rcode = G.last_exitcode; builtin_eval(argv); free(argv[1]); + G.pre_trap_exitcode = save_pre; G.last_exitcode = save_rcode; - G.pre_trap_exitcode = -1; # if ENABLE_HUSH_FUNCTIONS if (G.return_exitcode >= 0) { debug_printf_exec("trap exitcode:%d\n", G.return_exitcode); diff --git a/shell/hush_test/hush-misc/exitcode_trap6.right b/shell/hush_test/hush-misc/exitcode_trap6.right new file mode 100644 index 000000000..b76c1908e --- /dev/null +++ b/shell/hush_test/hush-misc/exitcode_trap6.right @@ -0,0 +1,2 @@ +INT +42:42 diff --git a/shell/hush_test/hush-misc/exitcode_trap6.tests b/shell/hush_test/hush-misc/exitcode_trap6.tests new file mode 100755 index 000000000..15fb99d2d --- /dev/null +++ b/shell/hush_test/hush-misc/exitcode_trap6.tests @@ -0,0 +1,11 @@ +# "exit" in trap should not use last command's exitcode, +# but exitcode on entering the trap. +# Nested trap should not interfere with this. +$THIS_SH -c ' + trap "echo INT" int + trap "kill -int $$;exit" term + kill $$ & + (exit 42) + wait +' +echo 42:$? |