[Bug 87] New: Last logon that gets reported upon login is the current login time

bugzilla-daemon at mindrot.org bugzilla-daemon at mindrot.org
Thu Jan 31 09:24:36 EST 2002


http://bugzilla.mindrot.org/show_bug.cgi?id=87

           Summary: Last logon that gets reported upon login is the current
                    login time
           Product: Portable OpenSSH
           Version: 3.0.2p1
          Platform: UltraSparc
        OS/Version: Solaris
            Status: NEW
          Severity: normal
          Priority: P2
         Component: sshd
        AssignedTo: openssh-unix-dev at mindrot.org
        ReportedBy: wknox at mitre.org


The last login time that gets reported with a Solaris PAM enabled build of
OpenSSH 3.0.2p1 is the login time of the current session. Examining the mail
archive, this was reported by Benn Oshrin on 10/12/2001, and he sent in a patch
that moved the do_pam_session call into the do_login function in session.c. I
can't find any discussion about why that patch did not get applied, but it
hasn't, so I propose, instead of moving the do_pam_session call, to move the
call to get_last_login_time into do_exec_pty and pass the resultant information
to do_login. This has the unfortunate result of getting information that you may
never use, but it seems that the portable release does have a few things in it
explicit for one system or another, so this may be viable. The definition of
do_login could be changed and the call could be made in do_exec_pty only on
Solaris using PAM (using a #ifdef PAM_SUN_CODEBASE), but that seemed overly
complicated to me. Any comments, anyone? Patch is below.

--- session.c~  Sat Dec  1 18:37:08 2001
+++ session.c   Tue Jan 29 16:14:25 2002
@@ -128,7 +128,7 @@
 void   do_exec_pty(Session *, const char *);
 void   do_exec_no_pty(Session *, const char *);
 void   do_exec(Session *, const char *);
-void   do_login(Session *, const char *);
+void   do_login(Session *, const char *, const time_t, const char *);
 #ifdef LOGIN_NEEDS_UTMPX
 static void    do_pre_login(Session *s);
 #endif
@@ -548,11 +548,17 @@
 {
        int fdout, ptyfd, ttyfd, ptymaster;
        pid_t pid;
+       char hostname[MAXHOSTNAMELEN];
+       time_t last_login_time;
 
        if (s == NULL)
                fatal("do_exec_pty: no session");
        ptyfd = s->ptyfd;
        ttyfd = s->ttyfd;
+       /* Get the time and hostname when the user last logged in. */
+       hostname[0] = '\0';
+       last_login_time = get_last_login_time(s->pw->pw_uid, s->pw->pw_name,
+           hostname, sizeof(hostname));
 
 #if defined(USE_PAM)
        do_pam_session(s->pw->pw_name, s->tty);
@@ -584,7 +590,7 @@
                /* record login, etc. similar to login(1) */
 #ifndef HAVE_OSF_SIA
                if (!(options.use_login && command == NULL))
-                       do_login(s, command);
+                       do_login(s, command, last_login_time, hostname);
 # ifdef LOGIN_NEEDS_UTMPX
                else
                        do_pre_login(s);
@@ -682,13 +688,11 @@
 
 /* administrative, login(1)-like work */
 void
-do_login(Session *s, const char *command)
+do_login(Session *s, const char *command, const time_t found_last_login_time,
const char *last_host)
 {
        char *time_string;
-       char hostname[MAXHOSTNAMELEN];
        socklen_t fromlen;
        struct sockaddr_storage from;
-       time_t last_login_time;
        struct passwd * pw = s->pw;
        pid_t pid = getpid();
 
@@ -706,13 +710,6 @@
                }
        }
 
-       /* Get the time and hostname when the user last logged in. */
-       if (options.print_lastlog) {
-               hostname[0] = '\0';
-               last_login_time = get_last_login_time(pw->pw_uid, pw->pw_name,
-                   hostname, sizeof(hostname));
-       }
-
        /* Record that there was a login on that tty from the remote host. */
        record_login(pid, s->tty, pw->pw_name, pw->pw_uid,
            get_remote_name_or_ip(utmp_len, options.reverse_mapping_check),
@@ -741,14 +738,14 @@
                printf("%s\n", aixloginmsg);
 #endif /* WITH_AIXAUTHENTICATE */
 
-       if (options.print_lastlog && last_login_time != 0) {
-               time_string = ctime(&last_login_time);
+       if (options.print_lastlog && found_last_login_time != 0) {
+               time_string = ctime(&found_last_login_time);
                if (strchr(time_string, '\n'))
                        *strchr(time_string, '\n') = 0;
-               if (strcmp(hostname, "") == 0)
+               if (strcmp(last_host, "") == 0)
                        printf("Last login: %s\r\n", time_string);
                else
-                       printf("Last login: %s from %s\r\n", time_string,
hostname);
+                       printf("Last login: %s from %s\r\n", time_string,
last_host);
        }
 
        do_motd();
@@ -1866,7 +1863,7 @@
 
        /* Record that the user has logged out. */
        if (s->pid != 0)
-               record_logout(s->pid, s->tty);
+               record_logout(s->pid, s->tty, s->pw->pw_name);
 
        /* Release the pseudo-tty. */
        pty_release(s->tty);



------- You are receiving this mail because: -------
You are the assignee for the bug, or are watching the assignee.



More information about the openssh-unix-dev mailing list