Control: forwarded -1 https://sourceware.org/bugzilla/show_bug.cgi?id=30701

On 2023-07-30 13:25 +0200, Sven Joachim wrote:

> Package: libc6
> Version: 2.37-6
> Tags: upstream
>
> The utmp(5) interface has broken its compatibility in 32-bit programs
> built with -D_TIME_BITS=64.  In bits/utmpx.h we see this:
>
> ,----
> | /* The fields ut_session and ut_tv must be the same size when compiled
> |    32- and 64-bit.  This allows files and shared memory to be shared
> |    between 32- and 64-bit applications.  */
> | #if __WORDSIZE_TIME64_COMPAT32
> |   __int32_t ut_session;             /* Session ID, used for windowing.  */
> |   struct
> |   {
> |     __int32_t tv_sec;               /* Seconds.  */
> |     __int32_t tv_usec;              /* Microseconds.  */
> |   } ut_tv;                  /* Time entry was made.  */
> | #else
> |   long int ut_session;              /* Session ID, used for windowing.  */
> |   struct timeval ut_tv;             /* Time entry was made.  */
> | #endif
> `----
>
> The definition of __WORDSIZE_TIME64_COMPAT32 can be found in bits/wordsize.h:
>
> ,----
> | #ifdef __x86_64__
> | # define __WORDSIZE_TIME64_COMPAT32 1
> | /* Both x86-64 and x32 use the 64-bit system call interface.  */
> | # define __SYSCALL_WORDSIZE         64
> | #else
> | # define __WORDSIZE_TIME64_COMPAT32 0
> | #endif
> `----
>
> So on i386 (and I suppose on other 32-bit architectures except x32)
> ut_tv is of struct timeval, and ut_tv.tv_sec is of time_t, which is
> actually a 64-bit integer in programs built with -D_TIME_BITS=64.
>
> One example where this already has caused problems is the who(1) program
> which has opted in for -D_TIME_BITS=64, see #1027135.

I had brought the "who" problem to the attention of the coreutils
developers[1], and they have now reported the issue in the Sourceware
Bugzilla.

Cheers,
       Sven


1. https://debbugs.gnu.org/64937

Reply via email to