diff options
author | cperciva <cperciva@FreeBSD.org> | 2004-01-22 04:24:15 +0000 |
---|---|---|
committer | cperciva <cperciva@FreeBSD.org> | 2004-01-22 04:24:15 +0000 |
commit | 9c74fea4de8e77e9b92b5390dcae4094dc36eba9 (patch) | |
tree | e48fdb610de4698d48e6fecbf521c827d2d0da5e | |
parent | 3474d78a20f157fc062bf5e4a9d97e1549bd4756 (diff) | |
download | FreeBSD-src-9c74fea4de8e77e9b92b5390dcae4094dc36eba9.zip FreeBSD-src-9c74fea4de8e77e9b92b5390dcae4094dc36eba9.tar.gz |
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)
-rw-r--r-- | usr.bin/lock/lock.c | 6 |
1 files changed, 4 insertions, 2 deletions
diff --git a/usr.bin/lock/lock.c b/usr.bin/lock/lock.c index 15d9941..3b19e35 100644 --- a/usr.bin/lock/lock.c +++ b/usr.bin/lock/lock.c @@ -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 */ } |