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/hush.c | |
parent | cc9ecd9af13f04a4814ebdec60942962c3e9f14f (diff) | |
download | busybox-w32-3ced804e3118d138781c3e4baa6bf1589b9f2dfd.tar.gz busybox-w32-3ced804e3118d138781c3e4baa6bf1589b9f2dfd.tar.bz2 busybox-w32-3ced804e3118d138781c3e4baa6bf1589b9f2dfd.zip |
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/hush.c')
-rw-r--r-- | shell/hush.c | 4 |
1 files changed, 3 insertions, 1 deletions
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) | |||
2107 | if (G_traps[sig][0]) { | 2107 | if (G_traps[sig][0]) { |
2108 | /* We have user-defined handler */ | 2108 | /* We have user-defined handler */ |
2109 | smalluint save_rcode; | 2109 | smalluint save_rcode; |
2110 | int save_pre; | ||
2110 | char *argv[3]; | 2111 | char *argv[3]; |
2111 | /* argv[0] is unused */ | 2112 | /* argv[0] is unused */ |
2112 | argv[1] = xstrdup(G_traps[sig]); | 2113 | argv[1] = xstrdup(G_traps[sig]); |
2113 | /* why strdup? trap can modify itself: trap 'trap "echo oops" INT' INT */ | 2114 | /* why strdup? trap can modify itself: trap 'trap "echo oops" INT' INT */ |
2114 | argv[2] = NULL; | 2115 | argv[2] = NULL; |
2116 | save_pre = G.pre_trap_exitcode; | ||
2115 | G.pre_trap_exitcode = save_rcode = G.last_exitcode; | 2117 | G.pre_trap_exitcode = save_rcode = G.last_exitcode; |
2116 | builtin_eval(argv); | 2118 | builtin_eval(argv); |
2117 | free(argv[1]); | 2119 | free(argv[1]); |
2120 | G.pre_trap_exitcode = save_pre; | ||
2118 | G.last_exitcode = save_rcode; | 2121 | G.last_exitcode = save_rcode; |
2119 | G.pre_trap_exitcode = -1; | ||
2120 | # if ENABLE_HUSH_FUNCTIONS | 2122 | # if ENABLE_HUSH_FUNCTIONS |
2121 | if (G.return_exitcode >= 0) { | 2123 | if (G.return_exitcode >= 0) { |
2122 | debug_printf_exec("trap exitcode:%d\n", G.return_exitcode); | 2124 | debug_printf_exec("trap exitcode:%d\n", G.return_exitcode); |