From dbde7c487dd28e79bc6677fb33c0dceccef9af98 Mon Sep 17 00:00:00 2001
Package: inetutils
Version: 1.6.91
From: Guillem Jover <guillem@hadrons.org>
Date: Thu, 3 Dec 2009 20:52:16 +0100
Status: applied
Subject: [PATCH 2/2] Use a temporary 'struct timeval' for gettimeofday

The utmp structures match the on-disk format, and need to have the same
size independent of the wordsize of the machine. So we use timeval for
gettimeofday and copy the results to avoid any damage to the variables.

* ftpd/logwtmp.c (logwtmp) [_HAVE_UT_TV]: Use a `struct timeval' variable
to get the result from gettimeofday.
* libinetutils/logwtmp.c (logwtmp) [HAVE_STRUCT_UTMP_UT_TV]: Likewise.
* libinetutils/utmp_init.c (utmp_init) [HAVE_STRUCT_UTMPX_UT_TV]: Likewise.
* libinetutils/utmp_logout.c (utmp_logout): Likewise.
---
 ftpd/logwtmp.c             |    7 ++++++-
 libinetutils/logwtmp.c     |    7 ++++++-
 libinetutils/utmp_init.c   |    7 ++++++-
 libinetutils/utmp_logout.c |   14 ++++++++++++--
 4 files changed, 30 insertions(+), 5 deletions(-)

diff --git a/ftpd/logwtmp.c b/ftpd/logwtmp.c
index 99e23f6..a21bd0c 100644
--- a/ftpd/logwtmp.c
+++ b/ftpd/logwtmp.c
@@ -74,6 +74,9 @@ void
 logwtmp (const char *line, const char *name, const char *host)
 {
   struct utmp ut;
+#if _HAVE_UT_TV - 0
+  struct timeval tv;
+#endif
 
   /* Set information in new entry.  */
   memset (&ut, 0, sizeof (ut));
@@ -87,7 +90,9 @@ logwtmp (const char *line, const char *name, const char *host)
 #endif
 
 #if _HAVE_UT_TV - 0
-  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 (&ut.ut_time);
 #endif
diff --git a/libinetutils/logwtmp.c b/libinetutils/logwtmp.c
index 0dad8cd..0940967 100644
--- a/libinetutils/logwtmp.c
+++ b/libinetutils/logwtmp.c
@@ -111,6 +111,9 @@ logwtmp (char *line, char *name, char *host)
 #endif
 {
   struct utmp ut;
+#ifdef HAVE_STRUCT_UTMP_UT_TV
+  struct timeval tv;
+#endif
 
   /* Set information in new entry.  */
   bzero (&ut, sizeof (ut));
@@ -124,7 +127,9 @@ logwtmp (char *line, char *name, char *host)
 #endif
 
 #ifdef HAVE_STRUCT_UTMP_UT_TV
-  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 (&ut.ut_time);
 #endif
diff --git a/libinetutils/utmp_init.c b/libinetutils/utmp_init.c
index 1ce2549..07fe050 100644
--- a/libinetutils/utmp_init.c
+++ b/libinetutils/utmp_init.c
@@ -76,6 +76,9 @@ utmp_init (char *line, char *user, char *id)
 #else
   struct utmp utx;
 #endif
+#if defined(HAVE_STRUCT_UTMPX_UT_TV)
+  struct timeval tv;
+#endif
 
   memset ((char *) &utx, 0, sizeof (utx));
 #if defined(HAVE_STRUCT_UTMP_UT_ID)
@@ -94,7 +97,9 @@ utmp_init (char *line, char *user, char *id)
   utx.ut_type = LOGIN_PROCESS;
 #endif
 #if defined(HAVE_STRUCT_UTMPX_UT_TV)
-  gettimeofday (&(utx.ut_tv), 0);
+  gettimeofday (&tv, 0);
+  utx.ut_tv.tv_sec = tv.tv_sec;
+  utx.ut_tv.tv_usec = tv.tv_usec;
 #else
   time (&(utx.ut_time));
 #endif
diff --git a/libinetutils/utmp_logout.c b/libinetutils/utmp_logout.c
index cea9e0d..cc36494 100644
--- a/libinetutils/utmp_logout.c
+++ b/libinetutils/utmp_logout.c
@@ -76,10 +76,14 @@ utmp_logout (char *line)
   ut = getutxline (&utx);
   if (ut)
     {
+      struct timeval tv;
+
       ut->ut_type = DEAD_PROCESS;
       ut->ut_exit.e_termination = 0;
       ut->ut_exit.e_exit = 0;
-      gettimeofday (&(ut->ut_tv), 0);
+      gettimeofday (&tv, 0);
+      ut->ut_tv.tv_sec = tv_sec;
+      ut->ut_tv.tv_usec = tv_usec;
       pututxline (ut);
       updwtmpx (PATH_WTMPX, ut);
     }
@@ -93,6 +97,10 @@ utmp_logout (char *line)
   ut = getutline (&utx);
   if (ut)
     {
+# ifdef HAVE_STRUCT_UTMP_UT_TV
+      struct timeval tv;
+# endif
+
 # ifdef HAVE_STRUCT_UTMP_UT_TYPE
       ut->ut_type = DEAD_PROCESS;
 # endif
@@ -101,7 +109,9 @@ utmp_logout (char *line)
       ut->ut_exit.e_exit = 0;
 # endif
 # ifdef HAVE_STRUCT_UTMP_UT_TV
-      gettimeofday (&(ut->ut_tv), 0);
+      gettimeofday (&tv, 0);
+      ut->ut_tv.tv_sec = tv.tv_sec;
+      ut->ut_tv.tv_usec = tv.tv_usec;
 # else
       time (&(ut->ut_time));
 # endif
-- 
1.6.5.3

