* passwd.cc (getpass): Make check for closed stream more reliable.

Check if setting tty attributes worked and only revert to old state
	if so.
This commit is contained in:
Corinna Vinschen 2012-07-09 12:57:03 +00:00
parent 821c8b9aac
commit 7c4626ed08
2 changed files with 19 additions and 8 deletions

View File

@ -1,4 +1,10 @@
2012-07-08 Corinna Vinschen <corinna@vinschen.de>
2012-07-09 Corinna Vinschen <corinna@vinschen.de>
* passwd.cc (getpass): Make check for closed stream more reliable.
Check if setting tty attributes worked and only revert to old state
if so.
2012-07-09 Corinna Vinschen <corinna@vinschen.de>
* Makefile.in, configure.in, mkvers.sh: Revert accidental checkin from
2012-07-06.

View File

@ -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)