diff -uprk.orig SimplePAMApps-0.60.orig/common/include/wtmp.h SimplePAMApps-0.60/common/include/wtmp.h --- SimplePAMApps-0.60.orig/common/include/wtmp.h 1998-11-25 16:35:10 +0300 +++ SimplePAMApps-0.60/common/include/wtmp.h 2004-02-08 20:49:01 +0300 @@ -1,5 +1,5 @@ int utmp_do_open_session(const char *user, const char *terminal , const char *rhost, pid_t pid , const char **callname, const char **err_descr); -int utmp_do_close_session(const char *terminal +int utmp_do_close_session(const char *user, const char *terminal , const char **callname, const char **err_descr); diff -uprk.orig SimplePAMApps-0.60.orig/common/lib/wtmp.c SimplePAMApps-0.60/common/lib/wtmp.c --- SimplePAMApps-0.60.orig/common/lib/wtmp.c 2004-02-08 20:38:32 +0300 +++ SimplePAMApps-0.60/common/lib/wtmp.c 2004-02-08 20:48:06 +0300 @@ -278,7 +278,7 @@ int utmp_do_open_session(const char *use return retval; } -int utmp_do_close_session(const char *terminal +int utmp_do_close_session(const char *user, const char *terminal , const char **callname, const char **err_descr) { int retval; @@ -313,7 +313,7 @@ int utmp_do_close_session(const char *te memset(&u_tmp, 0, sizeof(u_tmp)); strncpy(u_tmp.ut_line, ut_line, UT_LINESIZE); strncpy(u_tmp.ut_id, ut_id, UT_IDSIZE); - memset(&u_tmp.ut_user, 0, sizeof(u_tmp.ut_user)); + strncpy(u_tmp.ut_user, user, sizeof(u_tmp.ut_user)); memset(&u_tmp.ut_host, 0, sizeof(u_tmp.ut_host)); u_tmp.ut_addr = 0; u_tmp.ut_type = DEAD_PROCESS; /* `old' login process */ diff -uprk.orig SimplePAMApps-0.60.orig/pamapps/lib/wtmp-gate.c SimplePAMApps-0.60/pamapps/lib/wtmp-gate.c --- SimplePAMApps-0.60.orig/pamapps/lib/wtmp-gate.c 2004-02-08 20:38:32 +0300 +++ SimplePAMApps-0.60/pamapps/lib/wtmp-gate.c 2004-02-08 20:51:33 +0300 @@ -48,8 +48,14 @@ int utmp_close_session(pam_handle_t *pam , const char **callname, const char **err_descr) { int retval; - const char *terminal; + const char *user, *terminal; + retval = pam_get_item(pamh, PAM_USER, (const void **)&user); + if (retval != PAM_SUCCESS) { + *callname = "pam_get_item(PAM_USER)"; + *err_descr = pam_strerror(pamh, retval); + return -1; + } retval = pam_get_item(pamh, PAM_TTY, (const void **)&terminal); if (retval != PAM_SUCCESS) { *callname = "pam_get_item(PAM_TTY)"; @@ -59,5 +65,5 @@ int utmp_close_session(pam_handle_t *pam if (!terminal) terminal = "???"; return - utmp_do_close_session(terminal, callname, err_descr); + utmp_do_close_session(user, terminal, callname, err_descr); }