diff options
| -rw-r--r-- | libc/unistd/getpass.c | 9 | 
1 files changed, 7 insertions, 2 deletions
| diff --git a/libc/unistd/getpass.c b/libc/unistd/getpass.c index 83b0140c7..8ebc985df 100644 --- a/libc/unistd/getpass.c +++ b/libc/unistd/getpass.c @@ -61,8 +61,10 @@ getpass (prompt)        /* Save the old one. */        s = t;        /* Tricky, tricky. */ -      t.c_lflag &= ~(ECHO|ICANON|ISIG); +      t.c_lflag &= ~(ECHO|ISIG);        tty_changed = (tcsetattr (fileno (in), TCSAFLUSH|TCSASOFT, &t) == 0); +      /* Disable buffering for input FILE to prevent the buffering from flushing. */ +      setvbuf(in, NULL, _IOLBF, 0);      }    else      tty_changed = 0; @@ -89,8 +91,11 @@ getpass (prompt)      }    /* Restore the original setting.  */ -  if (tty_changed) +  if (tty_changed) {      (void) tcsetattr (fileno (in), TCSAFLUSH|TCSASOFT, &s); +    /* Re-enable buffering. */ +    setlinebuf(in); +  }    if (in != stdin)      /* We opened the terminal; now close it.  */ | 
