diff options
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); |