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>
This commit is contained in:
parent
5323af7f51
commit
a4747230ab
@ -341,6 +341,7 @@ int login_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
#if ENABLE_LOGIN_SESSION_AS_CHILD
|
#if ENABLE_LOGIN_SESSION_AS_CHILD
|
||||||
pid_t child_pid;
|
pid_t child_pid;
|
||||||
#endif
|
#endif
|
||||||
|
pid_t my_pid;
|
||||||
|
|
||||||
INIT_G();
|
INIT_G();
|
||||||
|
|
||||||
@ -525,6 +526,9 @@ int login_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
if (pw->pw_uid != 0)
|
if (pw->pw_uid != 0)
|
||||||
die_if_nologin();
|
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
|
#if ENABLE_LOGIN_SESSION_AS_CHILD
|
||||||
child_pid = vfork();
|
child_pid = vfork();
|
||||||
if (child_pid != 0) {
|
if (child_pid != 0) {
|
||||||
@ -532,8 +536,8 @@ int login_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
bb_simple_perror_msg("vfork");
|
bb_simple_perror_msg("vfork");
|
||||||
else {
|
else {
|
||||||
wait_for_exitstatus(child_pid);
|
wait_for_exitstatus(child_pid);
|
||||||
update_utmp_DEAD_PROCESS(child_pid);
|
|
||||||
}
|
}
|
||||||
|
update_utmp_DEAD_PROCESS(my_pid);
|
||||||
login_pam_end(pamh);
|
login_pam_end(pamh);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -546,8 +550,6 @@ int login_main(int argc UNUSED_PARAM, char **argv)
|
|||||||
fchown(0, pw->pw_uid, pw->pw_gid);
|
fchown(0, pw->pw_uid, pw->pw_gid);
|
||||||
fchmod(0, 0600);
|
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 */
|
/* We trust environment only if we run by root */
|
||||||
if (ENABLE_LOGIN_SCRIPTS && run_by_root)
|
if (ENABLE_LOGIN_SCRIPTS && run_by_root)
|
||||||
run_login_script(pw, full_tty);
|
run_login_script(pw, full_tty);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user