summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/passwd.cc
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/passwd.cc')
-rw-r--r--winsup/cygwin/passwd.cc19
1 files changed, 12 insertions, 7 deletions
diff --git a/winsup/cygwin/passwd.cc b/winsup/cygwin/passwd.cc
index 6e012ed68..c6abb0205 100644
--- a/winsup/cygwin/passwd.cc
+++ b/winsup/cygwin/passwd.cc
@@ -281,6 +281,7 @@ getpass (const char * prompt)
{
char *pass = _my_tls.locals.pass;
struct termios ti, newti;
+ bool tc_set = false;
/* Try to use controlling tty in the first place. Use stdin and stderr
only as fallback. */
@@ -295,19 +296,23 @@ getpass (const char * prompt)
}
/* Make sure to notice if stdin is closed. */
- if (tcgetattr (fileno (in), &ti) == -1)
- pass[0] = '\0';
- else
+ if (fileno (in) >= 0)
{
flockfile (in);
- newti = ti;
- newti.c_lflag &= ~(ECHO | ISIG); /* No echo, no signal handling. */
- tcsetattr (fileno (in), TCSANOW, &newti);
+ /* Change tty attributes if possible. */
+ if (!tcgetattr (fileno (in), &ti))
+ {
+ newti = ti;
+ newti.c_lflag &= ~(ECHO | ISIG); /* No echo, no signal handling. */
+ if (!tcsetattr (fileno (in), TCSANOW, &newti))
+ tc_set = true;
+ }
fputs (prompt, err);
fflush (err);
fgets (pass, _PASSWORD_LEN, in);
fprintf (err, "\n");
- tcsetattr (fileno (in), TCSANOW, &ti);
+ if (tc_set)
+ tcsetattr (fileno (in), TCSANOW, &ti);
funlockfile (in);
char *crlf = strpbrk (pass, "\r\n");
if (crlf)