Ignore SIGTTIN and SIGTTOU in main sudo process when I/O logging.

It is better to receive EIO from read()/write() than to be suspended
when we don't expect it.  Fixes a problem when our terminal is
revoked which can happen when, e.g. our sshd is killed unceremoniously.
Also, only change the value of "alive" from true to false, never
from false to true.  It is possible for us to receive notification
of the child having stopped after it is already dead.  This does
not mean it has risen from the grave.
This commit is contained in:
Todd C. Miller
2012-04-06 12:45:30 -04:00
parent b4acbc9fe0
commit bb898cd5df

View File

@@ -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)) {