From c0a75ce9d9f1a1e580f372e8d9e98a4aa05577cd Mon Sep 17 00:00:00 2001 From: "Todd C. Miller" Date: Thu, 5 Apr 2012 12:40:51 -0400 Subject: [PATCH] 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. --- src/exec_pty.c | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) 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)); } -- 2.50.1