Only enable pwfeedback when reading password from /dev/tty.

This effectively disables pwfeedback when the -S or -A options are used.
This commit is contained in:
Todd C. Miller
2020-02-05 10:53:49 -07:00
parent 0ca2d1427b
commit d219c64635

View File

@@ -124,8 +124,7 @@ tgetpass(const char *prompt, int timeout, int flags,
static const char *askpass;
static char buf[SUDO_CONV_REPL_MAX + 1];
int i, input, output, save_errno, ttyfd;
bool need_restart, neednl = false;
bool feedback = ISSET(flags, TGP_MASK);
bool feedback, need_restart, neednl;
enum tgetpass_errval errval;
debug_decl(tgetpass, SUDO_DEBUG_CONV);
@@ -141,8 +140,8 @@ restart:
/* Try to open /dev/tty if we are going to be using it for I/O. */
ttyfd = -1;
if (!ISSET(flags, TGP_STDIN|TGP_ASKPASS)) {
ttyfd = open(_PATH_TTY, O_RDWR);
/* If no tty present and we need to disable echo, try askpass. */
ttyfd = open(_PATH_TTY, O_RDWR);
if (ttyfd == -1 && !ISSET(flags, TGP_ECHO|TGP_NOECHO_TRY)) {
if (askpass == NULL || getenv_unhooked("DISPLAY") == NULL) {
sudo_warnx(U_("a terminal is required to read the password; either use the -S option to read from standard input or configure an askpass helper"));
@@ -164,12 +163,16 @@ restart:
signo[i] = 0;
pass = NULL;
save_errno = 0;
neednl = false;
need_restart = false;
feedback = false;
/* Use tty for reading/writing if available else use stdin/stderr. */
if (ttyfd == -1) {
input = STDIN_FILENO;
output = STDERR_FILENO;
/* Don't try to mask password if /dev/tty is not available. */
CLR(flags, TGP_MASK);
} else {
input = ttyfd;
output = ttyfd;
@@ -181,23 +184,20 @@ restart:
*/
if (!ISSET(flags, TGP_ECHO)) {
for (;;) {
if (feedback)
neednl = sudo_term_cbreak(input);
if (ISSET(flags, TGP_MASK))
neednl = feedback = sudo_term_cbreak(input);
else
neednl = sudo_term_noecho(input);
if (neednl || errno != EINTR)
break;
/* Received SIGTTOU, suspend the process. */
if (suspend(SIGTTOU, callback) == -1) {
if (input != STDIN_FILENO)
(void) close(input);
if (ttyfd != -1)
(void) close(ttyfd);
debug_return_ptr(NULL);
}
}
}
/* Only use feedback mode when we can disable echo. */
if (!neednl)
feedback = false;
/*
* Catch signals that would otherwise cause the user to end
@@ -254,8 +254,8 @@ restore:
/* Restore old tty settings if possible. */
(void) sudo_term_restore(input, true);
}
if (input != STDIN_FILENO)
(void) close(input);
if (ttyfd != -1)
(void) close(ttyfd);
/*
* If we were interrupted by a signal, resend it to ourselves