]> granicus.if.org Git - sudo/commitdiff
If select() return EBADF in the main event loop, one of the ttys
authorTodd C. Miller <Todd.Miller@courtesan.com>
Wed, 23 May 2012 19:00:22 +0000 (15:00 -0400)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Wed, 23 May 2012 19:00:22 +0000 (15:00 -0400)
must have gone away so perform any I/O we can and close the bad
fds.

--HG--
branch : 1.7

exec.c

diff --git a/exec.c b/exec.c
index 766302dedd8441047784fbdeeaf54eca9830de5b..f08493af9ab87842a47079eb02918d3f8ddd356f 100644 (file)
--- a/exec.c
+++ b/exec.c
@@ -369,6 +369,12 @@ sudo_execve(path, argv, envp, uid, cstat, dowait, bgmode)
        if (nready == -1) {
            if (errno == EINTR)
                continue;
+#ifdef _PATH_SUDO_IO_LOGDIR
+           if (errno == EBADF) {
+               /* One of the ttys must have gone away. */
+               goto do_tty_io;
+           }
+#endif
            error(1, "select failed");
        }
 #ifdef _PATH_SUDO_IO_LOGDIR
@@ -433,6 +439,7 @@ sudo_execve(path, argv, envp, uid, cstat, dowait, bgmode)
        }
 
 #ifdef _PATH_SUDO_IO_LOGDIR
+do_tty_io:
        if (perform_io(fdsr, fdsw, cstat) != 0) {
            /* I/O error, kill child if still alive and finish. */
            schedule_signal(SIGKILL);