diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2020-02-18 16:46:01 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2020-02-18 16:46:01 +0100 |
commit | 23bc562a0556d1c0ddad4252fa8d46c863b5fa88 (patch) | |
tree | 3ad95cdddd273d569f55c57dcb6fe8f6ae488d51 /shell/hush.c | |
parent | 47eb979404735b9528538968cb5eaac7355a0c5a (diff) | |
download | busybox-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.c | 20 |
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: |