diff mbox series

[v3,2/3] login: structs utmp, utmpx, lastlog _TIME_BITS independence (bug 30701)

Message ID ceb6950bb33af399460f48ea06214dd721e1b8b7.1712731247.git.fweimer@redhat.com
State New
Headers show
Series login: Use unsigned 32-bit types for seconds-since-epoch | expand

Commit Message

Florian Weimer April 10, 2024, 6:45 a.m. UTC
These structs describe file formats under /var/log, and should not
depend on the definition of _TIME_BITS.  This is achieved by
defining __WORDSIZE_TIME64_COMPAT32 to 1 on 32-bit ports that
support 32-bit time_t values (where __time_t is 32 bits).
---
 bits/wordsize.h                               |  6 ++++--
 login/Makefile                                |  4 +++-
 login/tst-utmp-size-64.c                      |  2 ++
 sysdeps/arm/bits/wordsize.h                   | 21 +++++++++++++++++++
 sysdeps/csky/bits/wordsize.h                  | 21 +++++++++++++++++++
 sysdeps/m68k/bits/wordsize.h                  | 21 +++++++++++++++++++
 sysdeps/microblaze/bits/wordsize.h            | 21 +++++++++++++++++++
 sysdeps/mips/bits/wordsize.h                  |  6 +-----
 sysdeps/nios2/bits/wordsize.h                 | 21 +++++++++++++++++++
 sysdeps/powerpc/powerpc32/bits/wordsize.h     |  3 +--
 sysdeps/powerpc/powerpc64/bits/wordsize.h     |  3 +--
 sysdeps/sh/bits/wordsize.h                    | 21 +++++++++++++++++++
 sysdeps/sparc/sparc32/bits/wordsize.h         |  2 +-
 sysdeps/sparc/sparc64/bits/wordsize.h         |  3 +--
 sysdeps/unix/sysv/linux/hppa/bits/wordsize.h  | 21 +++++++++++++++++++
 .../unix/sysv/linux/powerpc/bits/wordsize.h   |  3 +--
 sysdeps/unix/sysv/linux/sparc/bits/wordsize.h |  3 +--
 sysdeps/x86/bits/wordsize.h                   |  5 ++---
 18 files changed, 165 insertions(+), 22 deletions(-)
 create mode 100644 login/tst-utmp-size-64.c
 create mode 100644 sysdeps/arm/bits/wordsize.h
 create mode 100644 sysdeps/csky/bits/wordsize.h
 create mode 100644 sysdeps/m68k/bits/wordsize.h
 create mode 100644 sysdeps/microblaze/bits/wordsize.h
 create mode 100644 sysdeps/nios2/bits/wordsize.h
 create mode 100644 sysdeps/sh/bits/wordsize.h
 create mode 100644 sysdeps/unix/sysv/linux/hppa/bits/wordsize.h

Comments

Adhemerval Zanella April 12, 2024, 4:15 p.m. UTC | #1
On 10/04/24 03:45, Florian Weimer wrote:
> These structs describe file formats under /var/log, and should not
> depend on the definition of _TIME_BITS.  This is achieved by
> defining __WORDSIZE_TIME64_COMPAT32 to 1 on 32-bit ports that
> support 32-bit time_t values (where __time_t is 32 bits).

LGTM, thanks.

Reviewed-by: Adhemerval Zanella  <adhemerval.zanella@linaro.org>

> ---
>  bits/wordsize.h                               |  6 ++++--
>  login/Makefile                                |  4 +++-
>  login/tst-utmp-size-64.c                      |  2 ++
>  sysdeps/arm/bits/wordsize.h                   | 21 +++++++++++++++++++
>  sysdeps/csky/bits/wordsize.h                  | 21 +++++++++++++++++++
>  sysdeps/m68k/bits/wordsize.h                  | 21 +++++++++++++++++++
>  sysdeps/microblaze/bits/wordsize.h            | 21 +++++++++++++++++++
>  sysdeps/mips/bits/wordsize.h                  |  6 +-----
>  sysdeps/nios2/bits/wordsize.h                 | 21 +++++++++++++++++++
>  sysdeps/powerpc/powerpc32/bits/wordsize.h     |  3 +--
>  sysdeps/powerpc/powerpc64/bits/wordsize.h     |  3 +--
>  sysdeps/sh/bits/wordsize.h                    | 21 +++++++++++++++++++
>  sysdeps/sparc/sparc32/bits/wordsize.h         |  2 +-
>  sysdeps/sparc/sparc64/bits/wordsize.h         |  3 +--
>  sysdeps/unix/sysv/linux/hppa/bits/wordsize.h  | 21 +++++++++++++++++++
>  .../unix/sysv/linux/powerpc/bits/wordsize.h   |  3 +--
>  sysdeps/unix/sysv/linux/sparc/bits/wordsize.h |  3 +--
>  sysdeps/x86/bits/wordsize.h                   |  5 ++---
>  18 files changed, 165 insertions(+), 22 deletions(-)
>  create mode 100644 login/tst-utmp-size-64.c
>  create mode 100644 sysdeps/arm/bits/wordsize.h
>  create mode 100644 sysdeps/csky/bits/wordsize.h
>  create mode 100644 sysdeps/m68k/bits/wordsize.h
>  create mode 100644 sysdeps/microblaze/bits/wordsize.h
>  create mode 100644 sysdeps/nios2/bits/wordsize.h
>  create mode 100644 sysdeps/sh/bits/wordsize.h
>  create mode 100644 sysdeps/unix/sysv/linux/hppa/bits/wordsize.h
> 
> diff --git a/bits/wordsize.h b/bits/wordsize.h
> index 14edae3a11..53013a9275 100644
> --- a/bits/wordsize.h
> +++ b/bits/wordsize.h
> @@ -21,7 +21,9 @@
>  #define __WORDSIZE32_PTRDIFF_LONG
>  
>  /* Set to 1 in order to force time types to be 32 bits instead of 64 bits in
> -   struct lastlog and struct utmp{,x} on 64-bit ports.  This may be done in
> +   struct lastlog and struct utmp{,x}.  This may be done in
>     order to make 64-bit ports compatible with 32-bit ports.  Set to 0 for
> -   64-bit ports where the time types are 64-bits or for any 32-bit ports.  */
> +   64-bit ports where the time types are 64-bits and new 32-bit ports
> +   where time_t is 64 bits, and there is no companion architecture with
> +   32-bit time_t.  */
>  #define __WORDSIZE_TIME64_COMPAT32
> diff --git a/login/Makefile b/login/Makefile
> index b26ac42bfc..f91190e3dc 100644
> --- a/login/Makefile
> +++ b/login/Makefile
> @@ -44,7 +44,9 @@ subdir-dirs = programs
>  vpath %.c programs
>  
>  tests := tst-utmp tst-utmpx tst-grantpt tst-ptsname tst-getlogin tst-updwtmpx \
> -  tst-pututxline-lockfail tst-pututxline-cache tst-utmp-size
> +  tst-pututxline-lockfail tst-pututxline-cache tst-utmp-size tst-utmp-size-64
> +
> +CFLAGS-tst-utmp-size-64.c += -D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64
>  
>  # Empty compatibility library for old binaries.
>  extra-libs      := libutil
> diff --git a/login/tst-utmp-size-64.c b/login/tst-utmp-size-64.c
> new file mode 100644
> index 0000000000..7a581a4c12
> --- /dev/null
> +++ b/login/tst-utmp-size-64.c
> @@ -0,0 +1,2 @@
> +/* The on-disk layout must not change in time64 mode.  */
> +#include "tst-utmp-size.c"
> diff --git a/sysdeps/arm/bits/wordsize.h b/sysdeps/arm/bits/wordsize.h
> new file mode 100644
> index 0000000000..6ecbfe7c86
> --- /dev/null
> +++ b/sysdeps/arm/bits/wordsize.h
> @@ -0,0 +1,21 @@
> +/* Copyright (C) 1999-2024 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#define __WORDSIZE			32
> +#define __WORDSIZE_TIME64_COMPAT32	1
> +#define __WORDSIZE32_SIZE_ULONG		0
> +#define __WORDSIZE32_PTRDIFF_LONG	0
> diff --git a/sysdeps/csky/bits/wordsize.h b/sysdeps/csky/bits/wordsize.h
> new file mode 100644
> index 0000000000..6ecbfe7c86
> --- /dev/null
> +++ b/sysdeps/csky/bits/wordsize.h
> @@ -0,0 +1,21 @@
> +/* Copyright (C) 1999-2024 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#define __WORDSIZE			32
> +#define __WORDSIZE_TIME64_COMPAT32	1
> +#define __WORDSIZE32_SIZE_ULONG		0
> +#define __WORDSIZE32_PTRDIFF_LONG	0
> diff --git a/sysdeps/m68k/bits/wordsize.h b/sysdeps/m68k/bits/wordsize.h
> new file mode 100644
> index 0000000000..6ecbfe7c86
> --- /dev/null
> +++ b/sysdeps/m68k/bits/wordsize.h
> @@ -0,0 +1,21 @@
> +/* Copyright (C) 1999-2024 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#define __WORDSIZE			32
> +#define __WORDSIZE_TIME64_COMPAT32	1
> +#define __WORDSIZE32_SIZE_ULONG		0
> +#define __WORDSIZE32_PTRDIFF_LONG	0
> diff --git a/sysdeps/microblaze/bits/wordsize.h b/sysdeps/microblaze/bits/wordsize.h
> new file mode 100644
> index 0000000000..6ecbfe7c86
> --- /dev/null
> +++ b/sysdeps/microblaze/bits/wordsize.h
> @@ -0,0 +1,21 @@
> +/* Copyright (C) 1999-2024 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#define __WORDSIZE			32
> +#define __WORDSIZE_TIME64_COMPAT32	1
> +#define __WORDSIZE32_SIZE_ULONG		0
> +#define __WORDSIZE32_PTRDIFF_LONG	0
> diff --git a/sysdeps/mips/bits/wordsize.h b/sysdeps/mips/bits/wordsize.h
> index 57f0f2a22f..30dd3fd85d 100644
> --- a/sysdeps/mips/bits/wordsize.h
> +++ b/sysdeps/mips/bits/wordsize.h
> @@ -19,11 +19,7 @@
>  
>  #define __WORDSIZE			_MIPS_SZPTR
>  
> -#if _MIPS_SIM == _ABI64
> -# define __WORDSIZE_TIME64_COMPAT32	1
> -#else
> -# define __WORDSIZE_TIME64_COMPAT32	0
> -#endif
> +#define __WORDSIZE_TIME64_COMPAT32	1
>  
>  #if __WORDSIZE == 32
>  #define __WORDSIZE32_SIZE_ULONG		0
> diff --git a/sysdeps/nios2/bits/wordsize.h b/sysdeps/nios2/bits/wordsize.h
> new file mode 100644
> index 0000000000..6ecbfe7c86
> --- /dev/null
> +++ b/sysdeps/nios2/bits/wordsize.h
> @@ -0,0 +1,21 @@
> +/* Copyright (C) 1999-2024 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#define __WORDSIZE			32
> +#define __WORDSIZE_TIME64_COMPAT32	1
> +#define __WORDSIZE32_SIZE_ULONG		0
> +#define __WORDSIZE32_PTRDIFF_LONG	0
> diff --git a/sysdeps/powerpc/powerpc32/bits/wordsize.h b/sysdeps/powerpc/powerpc32/bits/wordsize.h
> index 04ca9debf0..6993fb6b29 100644
> --- a/sysdeps/powerpc/powerpc32/bits/wordsize.h
> +++ b/sysdeps/powerpc/powerpc32/bits/wordsize.h
> @@ -2,10 +2,9 @@
>  
>  #if defined __powerpc64__
>  # define __WORDSIZE	64
> -# define __WORDSIZE_TIME64_COMPAT32	1
>  #else
>  # define __WORDSIZE	32
> -# define __WORDSIZE_TIME64_COMPAT32	0
>  # define __WORDSIZE32_SIZE_ULONG	0
>  # define __WORDSIZE32_PTRDIFF_LONG	0
>  #endif
> +#define __WORDSIZE_TIME64_COMPAT32	1
> diff --git a/sysdeps/powerpc/powerpc64/bits/wordsize.h b/sysdeps/powerpc/powerpc64/bits/wordsize.h
> index 04ca9debf0..6993fb6b29 100644
> --- a/sysdeps/powerpc/powerpc64/bits/wordsize.h
> +++ b/sysdeps/powerpc/powerpc64/bits/wordsize.h
> @@ -2,10 +2,9 @@
>  
>  #if defined __powerpc64__
>  # define __WORDSIZE	64
> -# define __WORDSIZE_TIME64_COMPAT32	1
>  #else
>  # define __WORDSIZE	32
> -# define __WORDSIZE_TIME64_COMPAT32	0
>  # define __WORDSIZE32_SIZE_ULONG	0
>  # define __WORDSIZE32_PTRDIFF_LONG	0
>  #endif
> +#define __WORDSIZE_TIME64_COMPAT32	1
> diff --git a/sysdeps/sh/bits/wordsize.h b/sysdeps/sh/bits/wordsize.h
> new file mode 100644
> index 0000000000..6ecbfe7c86
> --- /dev/null
> +++ b/sysdeps/sh/bits/wordsize.h
> @@ -0,0 +1,21 @@
> +/* Copyright (C) 1999-2024 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#define __WORDSIZE			32
> +#define __WORDSIZE_TIME64_COMPAT32	1
> +#define __WORDSIZE32_SIZE_ULONG		0
> +#define __WORDSIZE32_PTRDIFF_LONG	0
> diff --git a/sysdeps/sparc/sparc32/bits/wordsize.h b/sysdeps/sparc/sparc32/bits/wordsize.h
> index 4bbd2e63b4..a2e79e0fa9 100644
> --- a/sysdeps/sparc/sparc32/bits/wordsize.h
> +++ b/sysdeps/sparc/sparc32/bits/wordsize.h
> @@ -1,6 +1,6 @@
>  /* Determine the wordsize from the preprocessor defines.  */
>  
>  #define __WORDSIZE	32
> -#define __WORDSIZE_TIME64_COMPAT32	0
> +#define __WORDSIZE_TIME64_COMPAT32	1
>  #define __WORDSIZE32_SIZE_ULONG	0
>  #define __WORDSIZE32_PTRDIFF_LONG	0
> diff --git a/sysdeps/sparc/sparc64/bits/wordsize.h b/sysdeps/sparc/sparc64/bits/wordsize.h
> index 2f66f10d72..ea103e5970 100644
> --- a/sysdeps/sparc/sparc64/bits/wordsize.h
> +++ b/sysdeps/sparc/sparc64/bits/wordsize.h
> @@ -2,10 +2,9 @@
>  
>  #if defined __arch64__ || defined __sparcv9
>  # define __WORDSIZE	64
> -# define __WORDSIZE_TIME64_COMPAT32	1
>  #else
>  # define __WORDSIZE	32
> -# define __WORDSIZE_TIME64_COMPAT32	0
>  # define __WORDSIZE32_SIZE_ULONG	0
>  # define __WORDSIZE32_PTRDIFF_LONG	0
>  #endif
> +#define __WORDSIZE_TIME64_COMPAT32	1
> diff --git a/sysdeps/unix/sysv/linux/hppa/bits/wordsize.h b/sysdeps/unix/sysv/linux/hppa/bits/wordsize.h
> new file mode 100644
> index 0000000000..6ecbfe7c86
> --- /dev/null
> +++ b/sysdeps/unix/sysv/linux/hppa/bits/wordsize.h
> @@ -0,0 +1,21 @@
> +/* Copyright (C) 1999-2024 Free Software Foundation, Inc.
> +   This file is part of the GNU C Library.
> +
> +   The GNU C Library is free software; you can redistribute it and/or
> +   modify it under the terms of the GNU Lesser General Public
> +   License as published by the Free Software Foundation; either
> +   version 2.1 of the License, or (at your option) any later version.
> +
> +   The GNU C Library is distributed in the hope that it will be useful,
> +   but WITHOUT ANY WARRANTY; without even the implied warranty of
> +   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> +   Lesser General Public License for more details.
> +
> +   You should have received a copy of the GNU Lesser General Public
> +   License along with the GNU C Library; if not, see
> +   <https://www.gnu.org/licenses/>.  */
> +
> +#define __WORDSIZE			32
> +#define __WORDSIZE_TIME64_COMPAT32	1
> +#define __WORDSIZE32_SIZE_ULONG		0
> +#define __WORDSIZE32_PTRDIFF_LONG	0
> diff --git a/sysdeps/unix/sysv/linux/powerpc/bits/wordsize.h b/sysdeps/unix/sysv/linux/powerpc/bits/wordsize.h
> index 04ca9debf0..6993fb6b29 100644
> --- a/sysdeps/unix/sysv/linux/powerpc/bits/wordsize.h
> +++ b/sysdeps/unix/sysv/linux/powerpc/bits/wordsize.h
> @@ -2,10 +2,9 @@
>  
>  #if defined __powerpc64__
>  # define __WORDSIZE	64
> -# define __WORDSIZE_TIME64_COMPAT32	1
>  #else
>  # define __WORDSIZE	32
> -# define __WORDSIZE_TIME64_COMPAT32	0
>  # define __WORDSIZE32_SIZE_ULONG	0
>  # define __WORDSIZE32_PTRDIFF_LONG	0
>  #endif
> +#define __WORDSIZE_TIME64_COMPAT32	1
> diff --git a/sysdeps/unix/sysv/linux/sparc/bits/wordsize.h b/sysdeps/unix/sysv/linux/sparc/bits/wordsize.h
> index 7562875ee2..ea103e5970 100644
> --- a/sysdeps/unix/sysv/linux/sparc/bits/wordsize.h
> +++ b/sysdeps/unix/sysv/linux/sparc/bits/wordsize.h
> @@ -2,10 +2,9 @@
>  
>  #if defined __arch64__ || defined __sparcv9
>  # define __WORDSIZE	64
> -# define __WORDSIZE_TIME64_COMPAT32	1
>  #else
>  # define __WORDSIZE	32
>  # define __WORDSIZE32_SIZE_ULONG	0
>  # define __WORDSIZE32_PTRDIFF_LONG	0
> -# define __WORDSIZE_TIME64_COMPAT32	0
>  #endif
> +#define __WORDSIZE_TIME64_COMPAT32	1
> diff --git a/sysdeps/x86/bits/wordsize.h b/sysdeps/x86/bits/wordsize.h
> index 70f652bca1..3f40aa76f9 100644
> --- a/sysdeps/x86/bits/wordsize.h
> +++ b/sysdeps/x86/bits/wordsize.h
> @@ -8,10 +8,9 @@
>  #define __WORDSIZE32_PTRDIFF_LONG	0
>  #endif
>  
> +#define __WORDSIZE_TIME64_COMPAT32 1
> +
>  #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
Paul Eggert April 12, 2024, 9:23 p.m. UTC | #2
On 2024-04-09 23:45, Florian Weimer wrote:
> diff --git a/sysdeps/x86/bits/wordsize.h b/sysdeps/x86/bits/wordsize.h
> index 70f652bca1..3f40aa76f9 100644
> --- a/sysdeps/x86/bits/wordsize.h
> +++ b/sysdeps/x86/bits/wordsize.h
> @@ -8,10 +8,9 @@
>   #define __WORDSIZE32_PTRDIFF_LONG	0
>   #endif
>   
> +#define __WORDSIZE_TIME64_COMPAT32 1
> +
>   #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

I'm still having a few qualms about this part of the patch, and 
similarly for ARM. To continue from an earlier round:

>> > On 4/3/24 11:39, Florian Weimer wrote:
>>> >> For consistency,
>>> >> if there is a 64-bit architecture that is coinstallable, define
>>> >> __WORDSIZE_TIME64_COMPAT32 to 1 on the 32-bit architectyre as well.
>> >
>> > Could you explain the advantage of consistency here? User code almost
>> > invariably assignes ut_tv.tv_sec to time_t (this is true of every
>> > instance I found of ut_tv in Gnulib source code, for example). So
>> > changing this field's type on platforms where time_t is 32 bits will
>> > likely be ineffective in practice, and might cause more problems than
>> > it cures.
> 
> Few applications with a 32-bit time_t will work once there is a value in
> this field with the MSB set.  So the relevant case is applications that
> were built with -D_TIME_BITS=64, and there the consistent behavior with
> the 64-bit architecture helps.

It appears that I was not clear, as I was worried about applications 
built on 32-bit ARM or x86 without -D_TIME_BITS=64, so please let me try 
again.

For obsolescent 32-bit time_t apps that deal with 32-bit on-disk 
timestamps I see two forms of "consistent behavior":

A. These obsolescent apps should behave consistently with how they've 
behaved for decades.

B. These obsolescent apps should behave consistently with how 64-bit 
time_t apps work on the same platform for timestamps after 2038.

Surely consistency (A) is more important than consistency (B). As you 
mentioned, there are countless other reasons these obsolescent apps 
won't work after 2038, so consistency (B) has no value. In contrast, 
consistency (A) - which is essentially "don't fiddle with obsolescent 
apps" - has the value of stability.

In other words, because it's better to not disturb obsolescent apps, we 
should leave ut_tv.tv_sec alone when apps are built with 32-bit time_t, 
even on platforms where there is a 64-bit arch that is coinstallable.
Florian Weimer April 15, 2024, 9:28 a.m. UTC | #3
* Paul Eggert:

> On 2024-04-09 23:45, Florian Weimer wrote:
>> diff --git a/sysdeps/x86/bits/wordsize.h b/sysdeps/x86/bits/wordsize.h
>> index 70f652bca1..3f40aa76f9 100644
>> --- a/sysdeps/x86/bits/wordsize.h
>> +++ b/sysdeps/x86/bits/wordsize.h
>> @@ -8,10 +8,9 @@
>>   #define __WORDSIZE32_PTRDIFF_LONG	0
>>   #endif
>>   +#define __WORDSIZE_TIME64_COMPAT32 1
>> +
>>   #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
>
> I'm still having a few qualms about this part of the patch, and
> similarly for ARM. To continue from an earlier round:
>
>>> > On 4/3/24 11:39, Florian Weimer wrote:
>>>> >> For consistency,
>>>> >> if there is a 64-bit architecture that is coinstallable, define
>>>> >> __WORDSIZE_TIME64_COMPAT32 to 1 on the 32-bit architectyre as well.
>>> >
>>> > Could you explain the advantage of consistency here? User code almost
>>> > invariably assignes ut_tv.tv_sec to time_t (this is true of every
>>> > instance I found of ut_tv in Gnulib source code, for example). So
>>> > changing this field's type on platforms where time_t is 32 bits will
>>> > likely be ineffective in practice, and might cause more problems than
>>> > it cures.
>> Few applications with a 32-bit time_t will work once there is a
>> value in
>> this field with the MSB set.  So the relevant case is applications that
>> were built with -D_TIME_BITS=64, and there the consistent behavior with
>> the 64-bit architecture helps.
>
> It appears that I was not clear, as I was worried about applications
> built on 32-bit ARM or x86 without -D_TIME_BITS=64, so please let me
> try again.
>
> For obsolescent 32-bit time_t apps that deal with 32-bit on-disk
> timestamps I see two forms of "consistent behavior":
>
> A. These obsolescent apps should behave consistently with how they've
> behaved for decades.
>
> B. These obsolescent apps should behave consistently with how 64-bit
> time_t apps work on the same platform for timestamps after 2038.
>
> Surely consistency (A) is more important than consistency (B).

Thank you, I think I better understood your position now.

The patch here is a source-only change.  Applications which are not
recompiled are unaffected by it.  So it does not necessarily contradict
(A), depending on how you read it.

With the present patch, the type follows this rule:

  If the field size is 64 bits, its type is time_t, otherwise the field
  type is uint32_t.

Your proposal would lead to a rule like this:

  If the field size is 64 bits, it is time_t.  If the field size is
  32 bits and time_t is 64 bits (in this translation unit), the field
  type is uint32_t.  Otherwise the field size is 32 bits and its type
  is int32_t.

From an application perspective, I don't think much changes.
Applications should process the field value as int64_t anyway, operating
on a copy.  (No conditional compilation should be needed.)  So no extra
conditional code should be needed compared to the simpler rule I
implemented.

The glibc header change would be a bit more involved because we
currently do not define __USE_TIME_BITS64 for Hurd, as far as I can see
(and the installed <features-time64.h> is probably garbled, so
<features.h> is broken?).  The tests probably would rely on a new macro
in <utmp-size.h>.  I can implement it that way, but I'm not sure if it's
worth the complexity.  This would only benefit obsolescent applications
that are recompiled.

Thanks,
Florian
Paul Eggert April 17, 2024, 9:14 p.m. UTC | #4
On 4/15/24 02:28, Florian Weimer wrote:
> I can implement it that way, but I'm not sure if it's
> worth the complexity.  This would only benefit obsolescent applications
> that are recompiled.

You're right, it would benefit only those old applications, and only 
when they are built in an obsolescent way (i.e., with 32-bit time_t).

If it's greater complexity to support obsolescent builds I suppose 
you're right, and let's not bother.

The old applications I help maintain are all using _TIME_BITS=64 on 
these platforms, so they won't be built in an obsolescent way and won't 
care about this.
diff mbox series

Patch

diff --git a/bits/wordsize.h b/bits/wordsize.h
index 14edae3a11..53013a9275 100644
--- a/bits/wordsize.h
+++ b/bits/wordsize.h
@@ -21,7 +21,9 @@ 
 #define __WORDSIZE32_PTRDIFF_LONG
 
 /* Set to 1 in order to force time types to be 32 bits instead of 64 bits in
-   struct lastlog and struct utmp{,x} on 64-bit ports.  This may be done in
+   struct lastlog and struct utmp{,x}.  This may be done in
    order to make 64-bit ports compatible with 32-bit ports.  Set to 0 for
-   64-bit ports where the time types are 64-bits or for any 32-bit ports.  */
+   64-bit ports where the time types are 64-bits and new 32-bit ports
+   where time_t is 64 bits, and there is no companion architecture with
+   32-bit time_t.  */
 #define __WORDSIZE_TIME64_COMPAT32
diff --git a/login/Makefile b/login/Makefile
index b26ac42bfc..f91190e3dc 100644
--- a/login/Makefile
+++ b/login/Makefile
@@ -44,7 +44,9 @@  subdir-dirs = programs
 vpath %.c programs
 
 tests := tst-utmp tst-utmpx tst-grantpt tst-ptsname tst-getlogin tst-updwtmpx \
-  tst-pututxline-lockfail tst-pututxline-cache tst-utmp-size
+  tst-pututxline-lockfail tst-pututxline-cache tst-utmp-size tst-utmp-size-64
+
+CFLAGS-tst-utmp-size-64.c += -D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64
 
 # Empty compatibility library for old binaries.
 extra-libs      := libutil
diff --git a/login/tst-utmp-size-64.c b/login/tst-utmp-size-64.c
new file mode 100644
index 0000000000..7a581a4c12
--- /dev/null
+++ b/login/tst-utmp-size-64.c
@@ -0,0 +1,2 @@ 
+/* The on-disk layout must not change in time64 mode.  */
+#include "tst-utmp-size.c"
diff --git a/sysdeps/arm/bits/wordsize.h b/sysdeps/arm/bits/wordsize.h
new file mode 100644
index 0000000000..6ecbfe7c86
--- /dev/null
+++ b/sysdeps/arm/bits/wordsize.h
@@ -0,0 +1,21 @@ 
+/* Copyright (C) 1999-2024 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#define __WORDSIZE			32
+#define __WORDSIZE_TIME64_COMPAT32	1
+#define __WORDSIZE32_SIZE_ULONG		0
+#define __WORDSIZE32_PTRDIFF_LONG	0
diff --git a/sysdeps/csky/bits/wordsize.h b/sysdeps/csky/bits/wordsize.h
new file mode 100644
index 0000000000..6ecbfe7c86
--- /dev/null
+++ b/sysdeps/csky/bits/wordsize.h
@@ -0,0 +1,21 @@ 
+/* Copyright (C) 1999-2024 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#define __WORDSIZE			32
+#define __WORDSIZE_TIME64_COMPAT32	1
+#define __WORDSIZE32_SIZE_ULONG		0
+#define __WORDSIZE32_PTRDIFF_LONG	0
diff --git a/sysdeps/m68k/bits/wordsize.h b/sysdeps/m68k/bits/wordsize.h
new file mode 100644
index 0000000000..6ecbfe7c86
--- /dev/null
+++ b/sysdeps/m68k/bits/wordsize.h
@@ -0,0 +1,21 @@ 
+/* Copyright (C) 1999-2024 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#define __WORDSIZE			32
+#define __WORDSIZE_TIME64_COMPAT32	1
+#define __WORDSIZE32_SIZE_ULONG		0
+#define __WORDSIZE32_PTRDIFF_LONG	0
diff --git a/sysdeps/microblaze/bits/wordsize.h b/sysdeps/microblaze/bits/wordsize.h
new file mode 100644
index 0000000000..6ecbfe7c86
--- /dev/null
+++ b/sysdeps/microblaze/bits/wordsize.h
@@ -0,0 +1,21 @@ 
+/* Copyright (C) 1999-2024 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#define __WORDSIZE			32
+#define __WORDSIZE_TIME64_COMPAT32	1
+#define __WORDSIZE32_SIZE_ULONG		0
+#define __WORDSIZE32_PTRDIFF_LONG	0
diff --git a/sysdeps/mips/bits/wordsize.h b/sysdeps/mips/bits/wordsize.h
index 57f0f2a22f..30dd3fd85d 100644
--- a/sysdeps/mips/bits/wordsize.h
+++ b/sysdeps/mips/bits/wordsize.h
@@ -19,11 +19,7 @@ 
 
 #define __WORDSIZE			_MIPS_SZPTR
 
-#if _MIPS_SIM == _ABI64
-# define __WORDSIZE_TIME64_COMPAT32	1
-#else
-# define __WORDSIZE_TIME64_COMPAT32	0
-#endif
+#define __WORDSIZE_TIME64_COMPAT32	1
 
 #if __WORDSIZE == 32
 #define __WORDSIZE32_SIZE_ULONG		0
diff --git a/sysdeps/nios2/bits/wordsize.h b/sysdeps/nios2/bits/wordsize.h
new file mode 100644
index 0000000000..6ecbfe7c86
--- /dev/null
+++ b/sysdeps/nios2/bits/wordsize.h
@@ -0,0 +1,21 @@ 
+/* Copyright (C) 1999-2024 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#define __WORDSIZE			32
+#define __WORDSIZE_TIME64_COMPAT32	1
+#define __WORDSIZE32_SIZE_ULONG		0
+#define __WORDSIZE32_PTRDIFF_LONG	0
diff --git a/sysdeps/powerpc/powerpc32/bits/wordsize.h b/sysdeps/powerpc/powerpc32/bits/wordsize.h
index 04ca9debf0..6993fb6b29 100644
--- a/sysdeps/powerpc/powerpc32/bits/wordsize.h
+++ b/sysdeps/powerpc/powerpc32/bits/wordsize.h
@@ -2,10 +2,9 @@ 
 
 #if defined __powerpc64__
 # define __WORDSIZE	64
-# define __WORDSIZE_TIME64_COMPAT32	1
 #else
 # define __WORDSIZE	32
-# define __WORDSIZE_TIME64_COMPAT32	0
 # define __WORDSIZE32_SIZE_ULONG	0
 # define __WORDSIZE32_PTRDIFF_LONG	0
 #endif
+#define __WORDSIZE_TIME64_COMPAT32	1
diff --git a/sysdeps/powerpc/powerpc64/bits/wordsize.h b/sysdeps/powerpc/powerpc64/bits/wordsize.h
index 04ca9debf0..6993fb6b29 100644
--- a/sysdeps/powerpc/powerpc64/bits/wordsize.h
+++ b/sysdeps/powerpc/powerpc64/bits/wordsize.h
@@ -2,10 +2,9 @@ 
 
 #if defined __powerpc64__
 # define __WORDSIZE	64
-# define __WORDSIZE_TIME64_COMPAT32	1
 #else
 # define __WORDSIZE	32
-# define __WORDSIZE_TIME64_COMPAT32	0
 # define __WORDSIZE32_SIZE_ULONG	0
 # define __WORDSIZE32_PTRDIFF_LONG	0
 #endif
+#define __WORDSIZE_TIME64_COMPAT32	1
diff --git a/sysdeps/sh/bits/wordsize.h b/sysdeps/sh/bits/wordsize.h
new file mode 100644
index 0000000000..6ecbfe7c86
--- /dev/null
+++ b/sysdeps/sh/bits/wordsize.h
@@ -0,0 +1,21 @@ 
+/* Copyright (C) 1999-2024 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#define __WORDSIZE			32
+#define __WORDSIZE_TIME64_COMPAT32	1
+#define __WORDSIZE32_SIZE_ULONG		0
+#define __WORDSIZE32_PTRDIFF_LONG	0
diff --git a/sysdeps/sparc/sparc32/bits/wordsize.h b/sysdeps/sparc/sparc32/bits/wordsize.h
index 4bbd2e63b4..a2e79e0fa9 100644
--- a/sysdeps/sparc/sparc32/bits/wordsize.h
+++ b/sysdeps/sparc/sparc32/bits/wordsize.h
@@ -1,6 +1,6 @@ 
 /* Determine the wordsize from the preprocessor defines.  */
 
 #define __WORDSIZE	32
-#define __WORDSIZE_TIME64_COMPAT32	0
+#define __WORDSIZE_TIME64_COMPAT32	1
 #define __WORDSIZE32_SIZE_ULONG	0
 #define __WORDSIZE32_PTRDIFF_LONG	0
diff --git a/sysdeps/sparc/sparc64/bits/wordsize.h b/sysdeps/sparc/sparc64/bits/wordsize.h
index 2f66f10d72..ea103e5970 100644
--- a/sysdeps/sparc/sparc64/bits/wordsize.h
+++ b/sysdeps/sparc/sparc64/bits/wordsize.h
@@ -2,10 +2,9 @@ 
 
 #if defined __arch64__ || defined __sparcv9
 # define __WORDSIZE	64
-# define __WORDSIZE_TIME64_COMPAT32	1
 #else
 # define __WORDSIZE	32
-# define __WORDSIZE_TIME64_COMPAT32	0
 # define __WORDSIZE32_SIZE_ULONG	0
 # define __WORDSIZE32_PTRDIFF_LONG	0
 #endif
+#define __WORDSIZE_TIME64_COMPAT32	1
diff --git a/sysdeps/unix/sysv/linux/hppa/bits/wordsize.h b/sysdeps/unix/sysv/linux/hppa/bits/wordsize.h
new file mode 100644
index 0000000000..6ecbfe7c86
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/hppa/bits/wordsize.h
@@ -0,0 +1,21 @@ 
+/* Copyright (C) 1999-2024 Free Software Foundation, Inc.
+   This file is part of the GNU C Library.
+
+   The GNU C Library is free software; you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public
+   License as published by the Free Software Foundation; either
+   version 2.1 of the License, or (at your option) any later version.
+
+   The GNU C Library is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+   Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
+
+#define __WORDSIZE			32
+#define __WORDSIZE_TIME64_COMPAT32	1
+#define __WORDSIZE32_SIZE_ULONG		0
+#define __WORDSIZE32_PTRDIFF_LONG	0
diff --git a/sysdeps/unix/sysv/linux/powerpc/bits/wordsize.h b/sysdeps/unix/sysv/linux/powerpc/bits/wordsize.h
index 04ca9debf0..6993fb6b29 100644
--- a/sysdeps/unix/sysv/linux/powerpc/bits/wordsize.h
+++ b/sysdeps/unix/sysv/linux/powerpc/bits/wordsize.h
@@ -2,10 +2,9 @@ 
 
 #if defined __powerpc64__
 # define __WORDSIZE	64
-# define __WORDSIZE_TIME64_COMPAT32	1
 #else
 # define __WORDSIZE	32
-# define __WORDSIZE_TIME64_COMPAT32	0
 # define __WORDSIZE32_SIZE_ULONG	0
 # define __WORDSIZE32_PTRDIFF_LONG	0
 #endif
+#define __WORDSIZE_TIME64_COMPAT32	1
diff --git a/sysdeps/unix/sysv/linux/sparc/bits/wordsize.h b/sysdeps/unix/sysv/linux/sparc/bits/wordsize.h
index 7562875ee2..ea103e5970 100644
--- a/sysdeps/unix/sysv/linux/sparc/bits/wordsize.h
+++ b/sysdeps/unix/sysv/linux/sparc/bits/wordsize.h
@@ -2,10 +2,9 @@ 
 
 #if defined __arch64__ || defined __sparcv9
 # define __WORDSIZE	64
-# define __WORDSIZE_TIME64_COMPAT32	1
 #else
 # define __WORDSIZE	32
 # define __WORDSIZE32_SIZE_ULONG	0
 # define __WORDSIZE32_PTRDIFF_LONG	0
-# define __WORDSIZE_TIME64_COMPAT32	0
 #endif
+#define __WORDSIZE_TIME64_COMPAT32	1
diff --git a/sysdeps/x86/bits/wordsize.h b/sysdeps/x86/bits/wordsize.h
index 70f652bca1..3f40aa76f9 100644
--- a/sysdeps/x86/bits/wordsize.h
+++ b/sysdeps/x86/bits/wordsize.h
@@ -8,10 +8,9 @@ 
 #define __WORDSIZE32_PTRDIFF_LONG	0
 #endif
 
+#define __WORDSIZE_TIME64_COMPAT32 1
+
 #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