From a4747230abfca9c5b5345d9e34574b4f3192be6a Mon Sep 17 00:00:00 2001 From: Joachim Nilsson Date: Sat, 9 May 2020 13:03:55 +0200 Subject: login: update UTMP before forking /bin/login updates the preliminary UTMP record created by /bin/getty for $LOGNAME. However, if the PID of login is not the same as getty, then it will create a new entry. This causes GLIBC getlogin(3) to return the string 'LOGIN' (set by getty) instead of $LOGNAME. This affects tools like /usr/bin/logname but also various 3rd party PAM applications. Signed-off-by: Joachim Nilsson Signed-off-by: Denys Vlasenko --- loginutils/login.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/loginutils/login.c b/loginutils/login.c index 4e65b3a19..3531d1424 100644 --- a/loginutils/login.c +++ b/loginutils/login.c @@ -341,6 +341,7 @@ int login_main(int argc UNUSED_PARAM, char **argv) #if ENABLE_LOGIN_SESSION_AS_CHILD pid_t child_pid; #endif + pid_t my_pid; INIT_G(); @@ -525,6 +526,9 @@ int login_main(int argc UNUSED_PARAM, char **argv) if (pw->pw_uid != 0) die_if_nologin(); + my_pid = getpid(); + update_utmp(my_pid, USER_PROCESS, short_tty, username, run_by_root ? opt_host : NULL); + #if ENABLE_LOGIN_SESSION_AS_CHILD child_pid = vfork(); if (child_pid != 0) { @@ -532,8 +536,8 @@ int login_main(int argc UNUSED_PARAM, char **argv) bb_simple_perror_msg("vfork"); else { wait_for_exitstatus(child_pid); - update_utmp_DEAD_PROCESS(child_pid); } + update_utmp_DEAD_PROCESS(my_pid); login_pam_end(pamh); return 0; } @@ -546,8 +550,6 @@ int login_main(int argc UNUSED_PARAM, char **argv) fchown(0, pw->pw_uid, pw->pw_gid); fchmod(0, 0600); - update_utmp(getpid(), USER_PROCESS, short_tty, username, run_by_root ? opt_host : NULL); - /* We trust environment only if we run by root */ if (ENABLE_LOGIN_SCRIPTS && run_by_root) run_login_script(pw, full_tty); -- cgit v1.2.3