diff options
author | Joachim Nilsson <troglobit@gmail.com> | 2020-05-09 13:03:55 +0200 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2020-11-16 12:09:53 +0100 |
commit | a4747230abfca9c5b5345d9e34574b4f3192be6a (patch) | |
tree | e0c4e6b0369027760ac609fe95f60b5f61f2c864 | |
parent | 5323af7f51808d5ff35c624ba70bdae4807f3717 (diff) | |
download | busybox-a4747230abfca9c5b5345d9e34574b4f3192be6a.tar.gz |
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 <troglobit@gmail.com>
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | loginutils/login.c | 8 |
1 files 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); |