diff --git a/src/exec_pty.c b/src/exec_pty.c index d24f27935..5ce320824 100644 --- a/src/exec_pty.c +++ b/src/exec_pty.c @@ -595,6 +595,11 @@ fork_pty(struct command_details *details, int sv[], int *maxfd) sa.sa_handler = handler; sigaction(SIGTSTP, &sa, NULL); + /* We don't want to receive SIGTTIN/SIGTTOU, getting EIO is preferable. */ + sa.sa_handler = SIG_IGN; + sigaction(SIGTTIN, &sa, NULL); + sigaction(SIGTTOU, &sa, NULL); + if (foreground) { /* Copy terminal attrs from user tty -> pty slave. */ if (term_copy(io_fds[SFD_USERTTY], io_fds[SFD_SLAVE])) { @@ -1027,10 +1032,12 @@ exec_monitor(struct command_details *details, int backchannel) * Handle SIGCHLD specially and deliver other signals * directly to the child. */ - if (signo == SIGCHLD) - alive = handle_sigchld(backchannel, &cstat); - else + if (signo == SIGCHLD) { + if (!handle_sigchld(backchannel, &cstat)) + alive = false; + } else { deliver_signal(child, signo, false); + } continue; } if (errpipe[0] != -1 && FD_ISSET(errpipe[0], fdsr)) {