From 54ca359425fa8db3734798f19d6bf822e4fd2096 Mon Sep 17 00:00:00 2001 From: Colin Percival Date: Thu, 22 Jan 2004 04:24:15 +0000 Subject: [PATCH] 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) --- usr.bin/lock/lock.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/usr.bin/lock/lock.c b/usr.bin/lock/lock.c index 15d994147e1..3b19e35bbe1 100644 --- a/usr.bin/lock/lock.c +++ b/usr.bin/lock/lock.c @@ -63,6 +63,7 @@ __FBSDID("$FreeBSD$"); #include #include #include +#include #include #include #include @@ -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 */ }