diff options
author | Denys Vlasenko | 2016-07-16 18:33:55 +0200 |
---|---|---|
committer | Denys Vlasenko | 2016-07-16 18:33:55 +0200 |
commit | e5814a5a42f40274aaadc1187680ffe5c4632c0e (patch) | |
tree | 4f0b282b781e4e2da2a02b4171b8d282ad4511b8 /shell/ash.c | |
parent | ca003385f1e32646c249dfcd3717afbe7535dcec (diff) | |
download | busybox-e5814a5a42f40274aaadc1187680ffe5c4632c0e.zip busybox-e5814a5a42f40274aaadc1187680ffe5c4632c0e.tar.gz |
ash: do not leave SIGQUIT ignored on "exec CMD"
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'shell/ash.c')
-rw-r--r-- | shell/ash.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/shell/ash.c b/shell/ash.c index faa45a8..4f6376f 100644 --- a/shell/ash.c +++ b/shell/ash.c @@ -323,7 +323,7 @@ struct globals_misc { #define S_DFL 1 /* default signal handling (SIG_DFL) */ #define S_CATCH 2 /* signal is caught */ #define S_IGN 3 /* signal is ignored (SIG_IGN) */ -#define S_HARD_IGN 4 /* signal is ignored permenantly */ +#define S_HARD_IGN 4 /* signal is ignored permanently */ /* indicates specified signal received */ uint8_t gotsig[NSIG - 1]; /* offset by 1: "signal" 0 is meaningless */ @@ -9024,7 +9024,20 @@ execcmd(int argc UNUSED_PARAM, char **argv) iflag = 0; /* exit on error */ mflag = 0; optschanged(); + /* We should set up signals for "exec CMD" + * the same way as for "CMD" without "exec". + * But optschanged->setinteractive->setsignal + * still thought we are a root shell. Therefore, for example, + * SIGQUIT is still set to IGN. Fix it: + */ + shlvl++; + setsignal(SIGQUIT); + /*setsignal(SIGTERM); - unnecessary because of iflag=0 */ + /*setsignal(SIGTSTP); - unnecessary because of mflag=0 */ + /*setsignal(SIGTTOU); - unnecessary because of mflag=0 */ + shellexec(argv + 1, pathval(), 0); + /* NOTREACHED */ } return 0; } |