]> granicus.if.org Git - sudo/commitdiff
now only turn off echo if it is already on. this fixes a race
authorTodd C. Miller <Todd.Miller@courtesan.com>
Tue, 30 Jul 1996 17:41:59 +0000 (17:41 +0000)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Tue, 30 Jul 1996 17:41:59 +0000 (17:41 +0000)
when you use sudo in a pipelin

tgetpass.c

index 256b16003ec5c5db77b62ae4a7df2121d74bad2c..e1398ebba53fa1f37e16217d30cd1a6df85ce4f8 100644 (file)
@@ -96,14 +96,11 @@ char * tgetpass(prompt, timeout)
 {
 #ifdef HAVE_TERMIOS_H
     struct termios term;
-    tcflag_t svflagval;
 #else
 #ifdef HAVE_TERMIO_H
     struct termio term;
-    unsigned short svflagval;
 #else
     struct sgttyb ttyb;
-    int svflagval;
 #endif /* HAVE_TERMIO_H */
 #endif /* HAVE_TERMIOS_H */
 #ifdef POSIX_SIGNALS
@@ -112,7 +109,7 @@ char * tgetpass(prompt, timeout)
 #else
     int oldmask;
 #endif /* POSIX_SIGNALS */
-    int n;
+    int n, echo;
     FILE *input, *output;
     static char buf[_PASSWD_LEN + 1];
     fd_set readfds;
@@ -122,7 +119,7 @@ char * tgetpass(prompt, timeout)
      * mask out SIGINT and SIGTSTP, should probably just catch and deal.
      */
 #ifdef POSIX_SIGNALS
-    (void) memset((VOID *)&mask, 0, sizeof(mask));
+    (void) sigemptyset(&mask);
     (void) sigaddset(&mask, SIGINT);
     (void) sigaddset(&mask, SIGTSTP);
     (void) sigprocmask(SIG_BLOCK, &mask, &oldmask);
@@ -147,20 +144,23 @@ char * tgetpass(prompt, timeout)
      */
 #ifdef HAVE_TERMIOS_H
     (void) tcgetattr(fileno(input), &term);
-    svflagval = term.c_lflag;
-    term.c_lflag &= ~ECHO;
-    (void) tcsetattr(fileno(input), TCSAFLUSH|TCSASOFT, &term);
+    if (echo = (term.c_lflag & ECHO)) {
+       term.c_lflag &= ~ECHO;
+       (void) tcsetattr(fileno(input), TCSAFLUSH|TCSASOFT, &term);
+    }
 #else
 #ifdef HAVE_TERMIO_H
     (void) ioctl(fileno(input), TCGETA, &term);
-    svflagval = term.c_lflag;
-    term.c_lflag &= ~ECHO;
-    (void) ioctl(fileno(input), TCSETA, &term);
+    if (echo = (term.c_lflag & ECHO)) {
+       term.c_lflag &= ~ECHO;
+       (void) ioctl(fileno(input), TCSETA, &term);
+    }
 #else
     (void) ioctl(fileno(input), TIOCGETP, &ttyb);
-    svflagval = ttyb.sg_flags;
-    ttyb.sg_flags &= ~ECHO;
-    (void) ioctl(fileno(input), TIOCSETP, &ttyb);
+    if (echo = (ttyb.sg_flags & ECHO)) {
+       ttyb.sg_flags &= ~ECHO;
+       (void) ioctl(fileno(input), TIOCSETP, &ttyb);
+    }
 #endif /* HAVE_TERMIO_H */
 #endif /* HAVE_TERMIOS_H */
 
@@ -212,15 +212,21 @@ char * tgetpass(prompt, timeout)
 
      /* turn on echo */
 #ifdef HAVE_TERMIOS_H
-    term.c_lflag = svflagval;
-    (void) tcsetattr(fileno(input), TCSAFLUSH|TCSASOFT, &term);
+    if (echo) {
+       term.c_lflag |= ECHO;
+       (void) tcsetattr(fileno(input), TCSAFLUSH|TCSASOFT, &term);
+    }
 #else
 #ifdef HAVE_TERMIO_H
-    term.c_lflag = svflagval;
-    (void) ioctl(fileno(input), TCSETA, &term);
+    if (echo) {
+       term.c_lflag |= ECHO;
+       (void) ioctl(fileno(input), TCSETA, &term);
+    }
 #else
-    ttyb.sg_flags = svflagval;
-    (void) ioctl(fileno(input), TIOCSETP, &ttyb);
+    if (echo) {
+       ttyb.sg_flags |= ECHO;
+       (void) ioctl(fileno(input), TIOCSETP, &ttyb);
+    }
 #endif /* HAVE_TERMIO_H */
 #endif /* HAVE_TERMIOS_H */