]> err.no Git - util-linux/commitdiff
login: update 32bit utmp correctly on 64bit system
authorKarel Zak <kzak@redhat.com>
Thu, 8 Mar 2007 22:22:06 +0000 (23:22 +0100)
committerKarel Zak <kzak@redhat.com>
Thu, 8 Mar 2007 22:22:06 +0000 (23:22 +0100)
On 64-bit platforms such as x86_64, glibc is usually built with 32-bit
compatibility for various structures. One of them is utmp.

What this means is that gettimeofday(&ut.ut_tv, NULL) on x86_64 will
end up overwriting the first parts of ut_addr_v6, leading to garbage
in the utmp file.

Signed-off-by: Karel Zak <kzak@redhat.com>
login-utils/login.c

index 1715015d54984a7170c19e8a877a5e1a5d7255db..d5ec1fc09fd14799296d34f79e8f5fe4e4069f59 100644 (file)
@@ -256,6 +256,7 @@ consoletty(int fd) {
 static void
 logbtmp(const char *line, const char *username, const char *hostname) {
        struct utmp ut;
+       struct timeval tv;
 
        memset(&ut, 0, sizeof(ut));
 
@@ -266,7 +267,9 @@ logbtmp(const char *line, const char *username, const char *hostname) {
        xstrncpy(ut.ut_line, line, sizeof(ut.ut_line));
 
 #if defined(_HAVE_UT_TV)           /* in <utmpbits.h> included by <utmp.h> */
-       gettimeofday(&ut.ut_tv, NULL);
+       gettimeofday(&tv, NULL);
+       ut.ut_tv.tv_sec = tv.tv_sec;
+       ut.ut_tv.tv_usec = tv.tv_usec;
 #else
        {
                time_t t;
@@ -833,6 +836,7 @@ main(int argc, char **argv)
     {
        struct utmp ut;
        struct utmp *utp;
+       struct timeval tv;
        
        utmpname(_PATH_UTMP);
        setutent();
@@ -872,7 +876,9 @@ Michael Riepe <michael@stud.uni-hannover.de>
        strncpy(ut.ut_user, username, sizeof(ut.ut_user));
        xstrncpy(ut.ut_line, tty_name, sizeof(ut.ut_line));
 #ifdef _HAVE_UT_TV             /* in <utmpbits.h> included by <utmp.h> */
-       gettimeofday(&ut.ut_tv, NULL);
+       gettimeofday(&tv, NULL);
+       ut.ut_tv.tv_sec = tv.tv_sec;
+       ut.ut_tv.tv_usec = tv.tv_usec;
 #else
        {
            time_t t;