diff options
author | Denis Vlasenko | 2006-09-08 17:56:52 +0000 |
---|---|---|
committer | Denis Vlasenko | 2006-09-08 17:56:52 +0000 |
commit | 2f50aa42c54fb92347058e83965ea7a668ab04af (patch) | |
tree | 27109df9cef9a348d98864bc52c1deeb1a7cd263 | |
parent | bd8f43dbab871d19484887556632af50749786b6 (diff) | |
download | busybox-2f50aa42c54fb92347058e83965ea7a668ab04af.zip busybox-2f50aa42c54fb92347058e83965ea7a668ab04af.tar.gz |
login: use some ideas from util-linux's login.
O_NONBLOCKing output on login timeout.
fchmod instead of chmod (latter is racy).
is_my_tty() is not needed anymore after race is fixed
(is_my_tty() was racy too anyway...).
-rw-r--r-- | loginutils/login.c | 40 |
1 files changed, 15 insertions, 25 deletions
diff --git a/loginutils/login.c b/loginutils/login.c index 19f8655..c0f4b72 100644 --- a/loginutils/login.c +++ b/loginutils/login.c @@ -51,14 +51,22 @@ static inline int check_securetty(void) { return 1; } #endif -static int is_my_tty(void); static void get_username_or_die(char *buf, int size_buf); static void motd(void); +static void nonblock(int fd) +{ + fcntl(fd, F_SETFL, O_NONBLOCK | fcntl(fd, F_GETFL)); +} static void alarm_handler(int sig ATTRIBUTE_UNUSED) { - fprintf(stderr, "\r\nLogin timed out after %d seconds\r\n", TIMEOUT); + /* This is the escape hatch! Poor serial line users and the like + * arrive here when their connection is broken. + * We don't want to block here */ + nonblock(1); + nonblock(2); + bb_info_msg("\r\nLogin timed out after %d seconds\r", TIMEOUT); exit(EXIT_SUCCESS); } @@ -218,13 +226,10 @@ auth_failed: } } #endif - if (!is_my_tty()) - syslog(LOG_ERR, "unable to determine TTY name, got %s", full_tty); - - /* Try these, but don't complain if they fail - * (for example when the root fs is read only) */ - chown(full_tty, pw->pw_uid, pw->pw_gid); - chmod(full_tty, 0600); + /* Try these, but don't complain if they fail. + * _f_chown is safe wrt race t=ttyname(0);...;chown(t); */ + fchown(0, pw->pw_uid, pw->pw_gid); + fchmod(0, 0600); if (ENABLE_LOGIN_SCRIPTS) { char *script = getenv("LOGIN_PRE_SUID_SCRIPT"); @@ -257,7 +262,7 @@ auth_failed: signal(SIGALRM, SIG_DFL); /* default alarm signal */ if (pw->pw_uid == 0) - syslog(LOG_INFO, "root login %s", fromhost); + syslog(LOG_INFO, "root login%s", fromhost); #ifdef CONFIG_SELINUX /* well, a simple setexeccon() here would do the job as well, * but let's play the game for now */ @@ -348,21 +353,6 @@ static int check_securetty(void) #endif -/* returns 1 if true */ -static int is_my_tty(void) -{ - struct stat by_name, by_fd; - - if (stat(full_tty, &by_name) || fstat(0, &by_fd)) - return 0; - - if (by_name.st_rdev != by_fd.st_rdev) - return 0; - else - return 1; -} - - static void motd(void) { FILE *fp; |