]> granicus.if.org Git - sudo/commitdiff
Don't try to restore the terminal if we are not the foreground
authorTodd C. Miller <Todd.Miller@courtesan.com>
Thu, 5 Apr 2012 16:40:51 +0000 (12:40 -0400)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Thu, 5 Apr 2012 16:40:51 +0000 (12:40 -0400)
process.  Otherwise, we may be stopped by SIGTTOU when we try to
update the terminal settings when cleaning up.

src/exec_pty.c

index 93cc9b0d2011172c2d91c27126f83492a325d6d0..e301d97f53925dc4e67ed431b933c67d6100625b 100644 (file)
@@ -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));
 }