ash: do not leave SIGQUIT ignored on "exec CMD"

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2016-07-16 18:33:55 +02:00
parent ca003385f1
commit e5814a5a42
3 changed files with 20 additions and 1 deletions

View File

@ -323,7 +323,7 @@ struct globals_misc {
#define S_DFL 1 /* default signal handling (SIG_DFL) */ #define S_DFL 1 /* default signal handling (SIG_DFL) */
#define S_CATCH 2 /* signal is caught */ #define S_CATCH 2 /* signal is caught */
#define S_IGN 3 /* signal is ignored (SIG_IGN) */ #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 */ /* indicates specified signal received */
uint8_t gotsig[NSIG - 1]; /* offset by 1: "signal" 0 is meaningless */ 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 */ iflag = 0; /* exit on error */
mflag = 0; mflag = 0;
optschanged(); 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); shellexec(argv + 1, pathval(), 0);
/* NOTREACHED */
} }
return 0; return 0;
} }

View File

@ -0,0 +1,2 @@
SigIgn: 0000000000000000
SigIgn: 0000000000000000

View File

@ -0,0 +1,4 @@
# Should show no masked signals in both cases.
# We had a bug where SIGQUIT was masked on exec.
grep SigIgn: /proc/self/status
exec grep SigIgn: /proc/self/status