From: Todd C. Miller Date: Wed, 9 Sep 2015 21:27:09 +0000 (-0600) Subject: Restore old signal handlers before tty settings. That way SIGTTOU X-Git-Tag: SUDO_1_8_15^2~55 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=38b7aea6b7841f3b3b35cbb654310de082dd133a;p=sudo Restore old signal handlers before tty settings. That way SIGTTOU is at its original value if sudo_term_restore() should fail. --- diff --git a/src/tgetpass.c b/src/tgetpass.c index fbda89373..3811fd587 100644 --- a/src/tgetpass.c +++ b/src/tgetpass.c @@ -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);