Two fixes here:
1. If fgets fails, don't go into an infinite cpu-intensive loop. Instead, check to see if the terminal still exists, and sleep(1) otherwise. 2. When we check to see if the terminal still exists, make sure we're not mislead by EINTR. This could have been a security issue, but fortunately the current implementation of tcgetattr doesn't EINTR. PR: bin/60758 Approved by: rwatson (mentor)
This commit is contained in:
parent
c66380c122
commit
54ca359425
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=124824
@ -63,6 +63,7 @@ __FBSDID("$FreeBSD$");
|
||||
#include <sys/consio.h>
|
||||
#include <err.h>
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <pwd.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
@ -212,7 +213,7 @@ main(int argc, char **argv)
|
||||
if (!fgets(s, sizeof(s), stdin)) {
|
||||
clearerr(stdin);
|
||||
hi(0);
|
||||
continue;
|
||||
goto tryagain;
|
||||
}
|
||||
if (usemine) {
|
||||
s[strlen(s) - 1] = '\0';
|
||||
@ -226,7 +227,8 @@ main(int argc, char **argv)
|
||||
if (getuid() == 0)
|
||||
syslog(LOG_NOTICE, "%d ROOT UNLOCK FAILURE%s (%s on %s)",
|
||||
failures, failures > 1 ? "S": "", ttynam, hostname);
|
||||
if (tcgetattr(0, &ntty))
|
||||
tryagain:
|
||||
if (tcgetattr(0, &ntty) && (errno != EINTR))
|
||||
exit(1);
|
||||
sleep(1); /* to discourage guessing */
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user