summaryrefslogtreecommitdiff
path: root/shell/hush.c
diff options
context:
space:
mode:
authorDenys Vlasenko <vda.linux@googlemail.com>2020-02-18 16:46:01 +0100
committerDenys Vlasenko <vda.linux@googlemail.com>2020-02-18 16:46:01 +0100
commit23bc562a0556d1c0ddad4252fa8d46c863b5fa88 (patch)
tree3ad95cdddd273d569f55c57dcb6fe8f6ae488d51 /shell/hush.c
parent47eb979404735b9528538968cb5eaac7355a0c5a (diff)
downloadbusybox-w32-23bc562a0556d1c0ddad4252fa8d46c863b5fa88.tar.gz
busybox-w32-23bc562a0556d1c0ddad4252fa8d46c863b5fa88.tar.bz2
busybox-w32-23bc562a0556d1c0ddad4252fa8d46c863b5fa88.zip
ash,hush: add comment about masked SIGCHLD, handle SIG_IGNed SIGHUP as in bash
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
Diffstat (limited to 'shell/hush.c')
-rw-r--r--shell/hush.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/shell/hush.c b/shell/hush.c
index 6e44d4e11..bced388bf 100644
--- a/shell/hush.c
+++ b/shell/hush.c
@@ -9775,10 +9775,14 @@ static void install_sighandlers(unsigned mask)
9775 */ 9775 */
9776 if (sig == SIGCHLD) 9776 if (sig == SIGCHLD)
9777 continue; 9777 continue;
9778 /* bash re-enables SIGHUP which is SIG_IGNed on entry. 9778 /* Interactive bash re-enables SIGHUP which is SIG_IGNed on entry.
9779 * Try: "trap '' HUP; bash; echo RET" and type "kill -HUP $$" 9779 * Try:
9780 * trap '' hup; bash; echo RET # type "kill -hup $$", see SIGHUP having effect
9781 * trap '' hup; bash -c 'kill -hup $$; echo ALIVE' # here SIGHUP is SIG_IGNed
9780 */ 9782 */
9781 //if (sig == SIGHUP) continue; - TODO? 9783 if (sig == SIGHUP && G_interactive_fd)
9784 continue;
9785 /* Unless one of the above signals, is it SIG_IGN? */
9782 if (old_handler == SIG_IGN) { 9786 if (old_handler == SIG_IGN) {
9783 /* oops... restore back to IGN, and record this fact */ 9787 /* oops... restore back to IGN, and record this fact */
9784 install_sighandler(sig, old_handler); 9788 install_sighandler(sig, old_handler);
@@ -11554,6 +11558,16 @@ static int wait_for_child_or_signal(struct pipe *waitfor_pipe, pid_t waitfor_pid
11554 /* It is vitally important for sigsuspend that SIGCHLD has non-DFL handler! */ 11558 /* It is vitally important for sigsuspend that SIGCHLD has non-DFL handler! */
11555 /* Note: sigsuspend invokes signal handler */ 11559 /* Note: sigsuspend invokes signal handler */
11556 sigsuspend(&oldset); 11560 sigsuspend(&oldset);
11561 /* ^^^ add "sigdelset(&oldset, SIGCHLD)" before sigsuspend
11562 * to make sure SIGCHLD is not masked off?
11563 * It was reported that this:
11564 * fn() { : | return; }
11565 * shopt -s lastpipe
11566 * fn
11567 * exec hush SCRIPT
11568 * under bash 4.4.23 runs SCRIPT with SIGCHLD masked,
11569 * making "wait" commands in SCRIPT block forever.
11570 */
11557 restore: 11571 restore:
11558 sigprocmask(SIG_SETMASK, &oldset, NULL); 11572 sigprocmask(SIG_SETMASK, &oldset, NULL);
11559 check_sig: 11573 check_sig: