]> granicus.if.org Git - sudo/commitdiff
Restore old signal handlers before tty settings. That way SIGTTOU
authorTodd C. Miller <Todd.Miller@courtesan.com>
Wed, 9 Sep 2015 21:27:09 +0000 (15:27 -0600)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Wed, 9 Sep 2015 21:27:09 +0000 (15:27 -0600)
is at its original value if sudo_term_restore() should fail.

src/tgetpass.c

index fbda893736464777662e1c99d1fae2d3d929addd..3811fd58743313d1916d3aee6bb121c8177017bb 100644 (file)
@@ -189,29 +189,31 @@ restart:
     }
 
 restore:
-    /* Restore old tty settings and signals. */
+    /* Restore old signal handlers. */
+    (void) sigaction(SIGALRM, &savealrm, NULL);
+    (void) sigaction(SIGINT, &saveint, NULL);
+    (void) sigaction(SIGHUP, &savehup, NULL);
+    (void) sigaction(SIGQUIT, &savequit, NULL);
+    (void) sigaction(SIGTERM, &saveterm, NULL);
+    (void) sigaction(SIGTSTP, &savetstp, NULL);
+    (void) sigaction(SIGTTIN, &savettin, NULL);
+    (void) sigaction(SIGTTOU, &savettou, NULL);
+    (void) sigaction(SIGPIPE, &savepipe, NULL);
+
+    /* Restore old tty settings. */
     if (!ISSET(flags, TGP_ECHO)) {
        for (;;) {
            /* Restore old tty settings if possible. */
            if (sudo_term_restore(input, 1) || errno != EINTR)
                break;
            /* Received SIGTTOU, suspend the process. */
+           signo[SIGTTOU] = 0;
            if (suspend(SIGTTOU, callback) == -1) {
-               if (input != STDIN_FILENO)
-                   (void) close(input);
-               debug_return_ptr(NULL);
+               pass = NULL;
+               break;
            }
        }
     }
-    (void) sigaction(SIGALRM, &savealrm, NULL);
-    (void) sigaction(SIGINT, &saveint, NULL);
-    (void) sigaction(SIGHUP, &savehup, NULL);
-    (void) sigaction(SIGQUIT, &savequit, NULL);
-    (void) sigaction(SIGTERM, &saveterm, NULL);
-    (void) sigaction(SIGTSTP, &savetstp, NULL);
-    (void) sigaction(SIGTTIN, &savettin, NULL);
-    (void) sigaction(SIGTTOU, &savettou, NULL);
-    (void) sigaction(SIGPIPE, &savepipe, NULL);
     if (input != STDIN_FILENO)
        (void) close(input);