[git commit] ash: do not leave SIGQUIT ignored on "exec CMD"

Denys Vlasenko vda.linux at googlemail.com
Sat Jul 16 16:33:55 UTC 2016


commit: https://git.busybox.net/busybox/commit/?id=e5814a5a42f40274aaadc1187680ffe5c4632c0e
branch: https://git.busybox.net/busybox/commit/?id=refs/heads/master

Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
---
 shell/ash.c                                   | 15 ++++++++++++++-
 shell/ash_test/ash-signals/sigquit_exec.right |  2 ++
 shell/ash_test/ash-signals/sigquit_exec.tests |  4 ++++
 3 files changed, 20 insertions(+), 1 deletion(-)

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;
 }
diff --git a/shell/ash_test/ash-signals/sigquit_exec.right b/shell/ash_test/ash-signals/sigquit_exec.right
new file mode 100644
index 0000000..a804192
--- /dev/null
+++ b/shell/ash_test/ash-signals/sigquit_exec.right
@@ -0,0 +1,2 @@
+SigIgn:	0000000000000000
+SigIgn:	0000000000000000
diff --git a/shell/ash_test/ash-signals/sigquit_exec.tests b/shell/ash_test/ash-signals/sigquit_exec.tests
new file mode 100755
index 0000000..24bda69
--- /dev/null
+++ b/shell/ash_test/ash-signals/sigquit_exec.tests
@@ -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


More information about the busybox-cvs mailing list