From: Todd C. Miller Date: Thu, 5 Apr 2012 16:40:51 +0000 (-0400) Subject: Don't try to restore the terminal if we are not the foreground X-Git-Tag: SUDO_1_8_5~1^2~83 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=c0a75ce9d9f1a1e580f372e8d9e98a4aa05577cd;p=sudo Don't try to restore the terminal if we are not the foreground process. Otherwise, we may be stopped by SIGTTOU when we try to update the terminal settings when cleaning up. --- diff --git a/src/exec_pty.c b/src/exec_pty.c index 93cc9b0d2..e301d97f5 100644 --- a/src/exec_pty.c +++ b/src/exec_pty.c @@ -113,8 +113,11 @@ cleanup(int gotsignal) { debug_decl(cleanup, SUDO_DEBUG_EXEC); - if (!tq_empty(&io_plugins)) - term_restore(io_fds[SFD_USERTTY], 0); + if (!tq_empty(&io_plugins) && io_fds[SFD_USERTTY] != -1) { + check_foreground(); + if (foreground) { + term_restore(io_fds[SFD_USERTTY], 0); + } #ifdef HAVE_SELINUX selinux_restore_tty(); #endif @@ -680,9 +683,12 @@ pty_close(struct command_status *cstat) flush_output(); if (io_fds[SFD_USERTTY] != -1) { - do { - n = term_restore(io_fds[SFD_USERTTY], 0); - } while (!n && errno == EINTR); + check_foreground(); + if (foreground) { + do { + n = term_restore(io_fds[SFD_USERTTY], 0); + } while (!n && errno == EINTR); + } } /* If child was signalled, write the reason to stdout like the shell. */ @@ -1004,7 +1010,7 @@ exec_monitor(struct command_details *details, int backchannel) goto done; if (errno == EINTR) continue; - error(1, _("select failed")); + error(1, "monitor: %s", _("select failed")); } if (FD_ISSET(signal_pipe[0], fdsr)) { @@ -1256,7 +1262,7 @@ safe_close(int fd) /* Avoid closing /dev/tty or std{in,out,err}. */ if (fd < 3 || fd == io_fds[SFD_USERTTY]) { errno = EINVAL; - return -1; + debug_return_int(-1); } debug_return_int(close(fd)); }