public inbox for libc-alpha@sourceware.org
 help / color / mirror / Atom feed
* [PATCH v3 0/3] login: Use unsigned 32-bit types for seconds-since-epoch
@ 2024-04-10  6:45 Florian Weimer
  2024-04-10  6:45 ` [PATCH v3 1/3] login: Check default sizes of structs utmp, utmpx, lastlog Florian Weimer
                   ` (2 more replies)
  0 siblings, 3 replies; 10+ messages in thread
From: Florian Weimer @ 2024-04-10  6:45 UTC (permalink / raw)
  To: libc-alpha

This new version fixes bug 30701 as well.  As a side effect, the
unsigned type change applies to all architectures that have 32-bit epoch
values.

New tests ensure that struct sizes do not change, and that the epoch
fields treat 0x80000000 as an unsigned value.

Built with build-many-glibcs.py.

Thanks,
Florian

Florian Weimer (3):
  login: Check default sizes of structs utmp, utmpx, lastlog
  login: structs utmp, utmpx, lastlog _TIME_BITS independence (bug
    30701)
  login: Use unsigned 32-bit types for seconds-since-epoch

 NEWS                                          |  9 ++++-
 bits/utmp.h                                   |  4 +-
 bits/wordsize.h                               |  6 ++-
 login/Makefile                                |  6 ++-
 login/tst-utmp-size-64.c                      |  2 +
 login/tst-utmp-size.c                         | 33 +++++++++++++++
 login/tst-utmp-unsigned-64.c                  |  1 +
 login/tst-utmp-unsigned.c                     | 40 +++++++++++++++++++
 sysdeps/arc/utmp-size.h                       |  3 ++
 sysdeps/arm/bits/wordsize.h                   | 21 ++++++++++
 sysdeps/arm/utmp-size.h                       |  2 +
 sysdeps/csky/bits/wordsize.h                  | 21 ++++++++++
 sysdeps/csky/utmp-size.h                      |  2 +
 sysdeps/generic/utmp-size.h                   | 23 +++++++++++
 sysdeps/gnu/bits/utmpx.h                      |  2 +-
 sysdeps/hppa/utmp-size.h                      |  2 +
 sysdeps/m68k/bits/wordsize.h                  | 21 ++++++++++
 sysdeps/m68k/utmp-size.h                      |  3 ++
 sysdeps/microblaze/bits/wordsize.h            | 21 ++++++++++
 sysdeps/microblaze/utmp-size.h                |  2 +
 sysdeps/mips/bits/wordsize.h                  |  6 +--
 sysdeps/mips/utmp-size.h                      |  2 +
 sysdeps/nios2/bits/wordsize.h                 | 21 ++++++++++
 sysdeps/nios2/utmp-size.h                     |  2 +
 sysdeps/or1k/utmp-size.h                      |  3 ++
 sysdeps/powerpc/powerpc32/bits/wordsize.h     |  3 +-
 sysdeps/powerpc/powerpc64/bits/wordsize.h     |  3 +-
 sysdeps/powerpc/utmp-size.h                   |  2 +
 sysdeps/riscv/utmp-size.h                     |  2 +
 sysdeps/sh/bits/wordsize.h                    | 21 ++++++++++
 sysdeps/sh/utmp-size.h                        |  2 +
 sysdeps/sparc/sparc32/bits/wordsize.h         |  2 +-
 sysdeps/sparc/sparc64/bits/wordsize.h         |  3 +-
 sysdeps/sparc/utmp-size.h                     |  2 +
 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 +--
 sysdeps/x86/utmp-size.h                       |  2 +
 39 files changed, 306 insertions(+), 26 deletions(-)
 create mode 100644 login/tst-utmp-size-64.c
 create mode 100644 login/tst-utmp-size.c
 create mode 100644 login/tst-utmp-unsigned-64.c
 create mode 100644 login/tst-utmp-unsigned.c
 create mode 100644 sysdeps/arc/utmp-size.h
 create mode 100644 sysdeps/arm/bits/wordsize.h
 create mode 100644 sysdeps/arm/utmp-size.h
 create mode 100644 sysdeps/csky/bits/wordsize.h
 create mode 100644 sysdeps/csky/utmp-size.h
 create mode 100644 sysdeps/generic/utmp-size.h
 create mode 100644 sysdeps/hppa/utmp-size.h
 create mode 100644 sysdeps/m68k/bits/wordsize.h
 create mode 100644 sysdeps/m68k/utmp-size.h
 create mode 100644 sysdeps/microblaze/bits/wordsize.h
 create mode 100644 sysdeps/microblaze/utmp-size.h
 create mode 100644 sysdeps/mips/utmp-size.h
 create mode 100644 sysdeps/nios2/bits/wordsize.h
 create mode 100644 sysdeps/nios2/utmp-size.h
 create mode 100644 sysdeps/or1k/utmp-size.h
 create mode 100644 sysdeps/powerpc/utmp-size.h
 create mode 100644 sysdeps/riscv/utmp-size.h
 create mode 100644 sysdeps/sh/bits/wordsize.h
 create mode 100644 sysdeps/sh/utmp-size.h
 create mode 100644 sysdeps/sparc/utmp-size.h
 create mode 100644 sysdeps/unix/sysv/linux/hppa/bits/wordsize.h
 create mode 100644 sysdeps/x86/utmp-size.h


base-commit: ae7468a7b0bcf22e9cd5fcae42bb9e4f65de83ee
-- 
2.44.0


^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH v3 1/3] login: Check default sizes of structs utmp, utmpx, lastlog
  2024-04-10  6:45 [PATCH v3 0/3] login: Use unsigned 32-bit types for seconds-since-epoch Florian Weimer
@ 2024-04-10  6:45 ` Florian Weimer
  2024-04-12 16:14   ` Adhemerval Zanella Netto
  2024-04-10  6:45 ` [PATCH v3 2/3] login: structs utmp, utmpx, lastlog _TIME_BITS independence (bug 30701) Florian Weimer
  2024-04-10  6:45 ` [PATCH v3 3/3] login: Use unsigned 32-bit types for seconds-since-epoch Florian Weimer
  2 siblings, 1 reply; 10+ messages in thread
From: Florian Weimer @ 2024-04-10  6:45 UTC (permalink / raw)
  To: libc-alpha

The default <utmp-size.h> is for ports with a 64-bit time_t.
Ports with a 32-bit time_t or with __WORDSIZE_TIME64_COMPAT32=1
need to override it.
---
 login/Makefile                 |  2 +-
 login/tst-utmp-size.c          | 33 +++++++++++++++++++++++++++++++++
 sysdeps/arc/utmp-size.h        |  3 +++
 sysdeps/arm/utmp-size.h        |  2 ++
 sysdeps/csky/utmp-size.h       |  2 ++
 sysdeps/generic/utmp-size.h    | 23 +++++++++++++++++++++++
 sysdeps/hppa/utmp-size.h       |  2 ++
 sysdeps/m68k/utmp-size.h       |  3 +++
 sysdeps/microblaze/utmp-size.h |  2 ++
 sysdeps/mips/utmp-size.h       |  2 ++
 sysdeps/nios2/utmp-size.h      |  2 ++
 sysdeps/or1k/utmp-size.h       |  3 +++
 sysdeps/powerpc/utmp-size.h    |  2 ++
 sysdeps/riscv/utmp-size.h      |  2 ++
 sysdeps/sh/utmp-size.h         |  2 ++
 sysdeps/sparc/utmp-size.h      |  2 ++
 sysdeps/x86/utmp-size.h        |  2 ++
 17 files changed, 88 insertions(+), 1 deletion(-)
 create mode 100644 login/tst-utmp-size.c
 create mode 100644 sysdeps/arc/utmp-size.h
 create mode 100644 sysdeps/arm/utmp-size.h
 create mode 100644 sysdeps/csky/utmp-size.h
 create mode 100644 sysdeps/generic/utmp-size.h
 create mode 100644 sysdeps/hppa/utmp-size.h
 create mode 100644 sysdeps/m68k/utmp-size.h
 create mode 100644 sysdeps/microblaze/utmp-size.h
 create mode 100644 sysdeps/mips/utmp-size.h
 create mode 100644 sysdeps/nios2/utmp-size.h
 create mode 100644 sysdeps/or1k/utmp-size.h
 create mode 100644 sysdeps/powerpc/utmp-size.h
 create mode 100644 sysdeps/riscv/utmp-size.h
 create mode 100644 sysdeps/sh/utmp-size.h
 create mode 100644 sysdeps/sparc/utmp-size.h
 create mode 100644 sysdeps/x86/utmp-size.h

diff --git a/login/Makefile b/login/Makefile
index 1e22008a61..b26ac42bfc 100644
--- a/login/Makefile
+++ b/login/Makefile
@@ -44,7 +44,7 @@ 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-pututxline-lockfail tst-pututxline-cache tst-utmp-size
 
 # Empty compatibility library for old binaries.
 extra-libs      := libutil
diff --git a/login/tst-utmp-size.c b/login/tst-utmp-size.c
new file mode 100644
index 0000000000..1b7f7ff042
--- /dev/null
+++ b/login/tst-utmp-size.c
@@ -0,0 +1,33 @@
+/* Check expected sizes of struct utmp, struct utmpx, struct lastlog.
+   Copyright (C) 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/>.  */
+
+#include <utmp.h>
+#include <utmpx.h>
+#include <utmp-size.h>
+
+static int
+do_test (void)
+{
+  _Static_assert (sizeof (struct utmp) == UTMP_SIZE, "struct utmp size");
+  _Static_assert (sizeof (struct utmpx) == UTMP_SIZE, "struct utmpx size");
+  _Static_assert (sizeof (struct lastlog) == LASTLOG_SIZE,
+                  "struct lastlog size");
+  return 0;
+}
+
+#include <support/test-driver.c>
diff --git a/sysdeps/arc/utmp-size.h b/sysdeps/arc/utmp-size.h
new file mode 100644
index 0000000000..a247fcd3da
--- /dev/null
+++ b/sysdeps/arc/utmp-size.h
@@ -0,0 +1,3 @@
+/* arc has less padding than other architectures with 64-bit time_t.  */
+#define UTMP_SIZE 392
+#define LASTLOG_SIZE 296
diff --git a/sysdeps/arm/utmp-size.h b/sysdeps/arm/utmp-size.h
new file mode 100644
index 0000000000..8f21ebe1b6
--- /dev/null
+++ b/sysdeps/arm/utmp-size.h
@@ -0,0 +1,2 @@
+#define UTMP_SIZE 384
+#define LASTLOG_SIZE 292
diff --git a/sysdeps/csky/utmp-size.h b/sysdeps/csky/utmp-size.h
new file mode 100644
index 0000000000..8f21ebe1b6
--- /dev/null
+++ b/sysdeps/csky/utmp-size.h
@@ -0,0 +1,2 @@
+#define UTMP_SIZE 384
+#define LASTLOG_SIZE 292
diff --git a/sysdeps/generic/utmp-size.h b/sysdeps/generic/utmp-size.h
new file mode 100644
index 0000000000..89dbe878b0
--- /dev/null
+++ b/sysdeps/generic/utmp-size.h
@@ -0,0 +1,23 @@
+/* Expected sizes of utmp-related structures stored in files.  64-bit version.
+   Copyright (C) 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/>.  */
+
+/* Expected size, in bytes, of struct utmp and struct utmpx.  */
+#define UTMP_SIZE 400
+
+/* Expected size, in bytes, of struct lastlog.  */
+#define LASTLOG_SIZE 296
diff --git a/sysdeps/hppa/utmp-size.h b/sysdeps/hppa/utmp-size.h
new file mode 100644
index 0000000000..8f21ebe1b6
--- /dev/null
+++ b/sysdeps/hppa/utmp-size.h
@@ -0,0 +1,2 @@
+#define UTMP_SIZE 384
+#define LASTLOG_SIZE 292
diff --git a/sysdeps/m68k/utmp-size.h b/sysdeps/m68k/utmp-size.h
new file mode 100644
index 0000000000..5946685819
--- /dev/null
+++ b/sysdeps/m68k/utmp-size.h
@@ -0,0 +1,3 @@
+/* m68k has 2-byte alignment.  */
+#define UTMP_SIZE 382
+#define LASTLOG_SIZE 292
diff --git a/sysdeps/microblaze/utmp-size.h b/sysdeps/microblaze/utmp-size.h
new file mode 100644
index 0000000000..8f21ebe1b6
--- /dev/null
+++ b/sysdeps/microblaze/utmp-size.h
@@ -0,0 +1,2 @@
+#define UTMP_SIZE 384
+#define LASTLOG_SIZE 292
diff --git a/sysdeps/mips/utmp-size.h b/sysdeps/mips/utmp-size.h
new file mode 100644
index 0000000000..8f21ebe1b6
--- /dev/null
+++ b/sysdeps/mips/utmp-size.h
@@ -0,0 +1,2 @@
+#define UTMP_SIZE 384
+#define LASTLOG_SIZE 292
diff --git a/sysdeps/nios2/utmp-size.h b/sysdeps/nios2/utmp-size.h
new file mode 100644
index 0000000000..8f21ebe1b6
--- /dev/null
+++ b/sysdeps/nios2/utmp-size.h
@@ -0,0 +1,2 @@
+#define UTMP_SIZE 384
+#define LASTLOG_SIZE 292
diff --git a/sysdeps/or1k/utmp-size.h b/sysdeps/or1k/utmp-size.h
new file mode 100644
index 0000000000..6b3653aa4d
--- /dev/null
+++ b/sysdeps/or1k/utmp-size.h
@@ -0,0 +1,3 @@
+/* or1k has less padding than other architectures with 64-bit time_t.  */
+#define UTMP_SIZE 392
+#define LASTLOG_SIZE 296
diff --git a/sysdeps/powerpc/utmp-size.h b/sysdeps/powerpc/utmp-size.h
new file mode 100644
index 0000000000..8f21ebe1b6
--- /dev/null
+++ b/sysdeps/powerpc/utmp-size.h
@@ -0,0 +1,2 @@
+#define UTMP_SIZE 384
+#define LASTLOG_SIZE 292
diff --git a/sysdeps/riscv/utmp-size.h b/sysdeps/riscv/utmp-size.h
new file mode 100644
index 0000000000..8f21ebe1b6
--- /dev/null
+++ b/sysdeps/riscv/utmp-size.h
@@ -0,0 +1,2 @@
+#define UTMP_SIZE 384
+#define LASTLOG_SIZE 292
diff --git a/sysdeps/sh/utmp-size.h b/sysdeps/sh/utmp-size.h
new file mode 100644
index 0000000000..8f21ebe1b6
--- /dev/null
+++ b/sysdeps/sh/utmp-size.h
@@ -0,0 +1,2 @@
+#define UTMP_SIZE 384
+#define LASTLOG_SIZE 292
diff --git a/sysdeps/sparc/utmp-size.h b/sysdeps/sparc/utmp-size.h
new file mode 100644
index 0000000000..8f21ebe1b6
--- /dev/null
+++ b/sysdeps/sparc/utmp-size.h
@@ -0,0 +1,2 @@
+#define UTMP_SIZE 384
+#define LASTLOG_SIZE 292
diff --git a/sysdeps/x86/utmp-size.h b/sysdeps/x86/utmp-size.h
new file mode 100644
index 0000000000..8f21ebe1b6
--- /dev/null
+++ b/sysdeps/x86/utmp-size.h
@@ -0,0 +1,2 @@
+#define UTMP_SIZE 384
+#define LASTLOG_SIZE 292
-- 
2.44.0



^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH v3 2/3] login: structs utmp, utmpx, lastlog _TIME_BITS independence (bug 30701)
  2024-04-10  6:45 [PATCH v3 0/3] login: Use unsigned 32-bit types for seconds-since-epoch Florian Weimer
  2024-04-10  6:45 ` [PATCH v3 1/3] login: Check default sizes of structs utmp, utmpx, lastlog Florian Weimer
@ 2024-04-10  6:45 ` Florian Weimer
  2024-04-12 16:15   ` Adhemerval Zanella Netto
  2024-04-12 21:23   ` Paul Eggert
  2024-04-10  6:45 ` [PATCH v3 3/3] login: Use unsigned 32-bit types for seconds-since-epoch Florian Weimer
  2 siblings, 2 replies; 10+ messages in thread
From: Florian Weimer @ 2024-04-10  6:45 UTC (permalink / raw)
  To: libc-alpha

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

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
-- 
2.44.0



^ permalink raw reply	[flat|nested] 10+ messages in thread

* [PATCH v3 3/3] login: Use unsigned 32-bit types for seconds-since-epoch
  2024-04-10  6:45 [PATCH v3 0/3] login: Use unsigned 32-bit types for seconds-since-epoch Florian Weimer
  2024-04-10  6:45 ` [PATCH v3 1/3] login: Check default sizes of structs utmp, utmpx, lastlog Florian Weimer
  2024-04-10  6:45 ` [PATCH v3 2/3] login: structs utmp, utmpx, lastlog _TIME_BITS independence (bug 30701) Florian Weimer
@ 2024-04-10  6:45 ` Florian Weimer
  2024-04-12 16:19   ` Adhemerval Zanella Netto
  2 siblings, 1 reply; 10+ messages in thread
From: Florian Weimer @ 2024-04-10  6:45 UTC (permalink / raw)
  To: libc-alpha

These fields store timestamps when the system was running.  No Linux
systems existed before 1970, so these values are unused.  Switching
to unsigned types allows continued use of the existing struct layouts
beyond the year 2038.

The intent is to give distributions more time to switch to improved
interfaces that also avoid locking/data corruption issues.
---
 NEWS                         |  9 +++++++-
 bits/utmp.h                  |  4 ++--
 login/Makefile               |  4 +++-
 login/tst-utmp-unsigned-64.c |  1 +
 login/tst-utmp-unsigned.c    | 40 ++++++++++++++++++++++++++++++++++++
 sysdeps/gnu/bits/utmpx.h     |  2 +-
 6 files changed, 55 insertions(+), 5 deletions(-)
 create mode 100644 login/tst-utmp-unsigned-64.c
 create mode 100644 login/tst-utmp-unsigned.c

diff --git a/NEWS b/NEWS
index da4b2223e9..cf6078cf20 100644
--- a/NEWS
+++ b/NEWS
@@ -28,7 +28,14 @@ Major new features:
 
 Deprecated and removed features, and other changes affecting compatibility:
 
-  [Add deprecations, removals and changes affecting compatibility here]
+* Architectures which use a 32-bit seconds-since-epoch field in struct
+  lastlog, struct utmp, struct utmpx (such as i386, powerpc64le, rv32,
+  rv64, x86-64) switched from a signed to an unsigned type for that
+  field.  This allows these fields to store timestamps beyond the year
+  2038, until the year 2106.  Please note that applications are still
+  expected to migrate off the interfaces declared in <utmp.h> and
+  <utmpx.h> (except for login_tty) due to locking and session management
+  problems.
 
 Changes to build and runtime requirements:
 
diff --git a/bits/utmp.h b/bits/utmp.h
index f2d1c13d8c..27cb536800 100644
--- a/bits/utmp.h
+++ b/bits/utmp.h
@@ -36,7 +36,7 @@
 struct lastlog
   {
 #if __WORDSIZE_TIME64_COMPAT32
-    int32_t ll_time;
+    __uint32_t ll_time;
 #else
     __time_t ll_time;
 #endif
@@ -76,7 +76,7 @@ struct utmp
   int32_t ut_session;		/* Session ID, used for windowing.  */
   struct
   {
-    int32_t tv_sec;		/* Seconds.  */
+    __uint32_t tv_sec;		/* Seconds.  */
     int32_t tv_usec;		/* Microseconds.  */
   } ut_tv;			/* Time entry was made.  */
 #else
diff --git a/login/Makefile b/login/Makefile
index f91190e3dc..84563230ef 100644
--- a/login/Makefile
+++ b/login/Makefile
@@ -44,9 +44,11 @@ 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-utmp-size-64
+  tst-pututxline-lockfail tst-pututxline-cache tst-utmp-size tst-utmp-size-64 \
+  tst-utmp-unsigned tst-utmp-unsigned-64
 
 CFLAGS-tst-utmp-size-64.c += -D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64
+CFLAGS-tst-utmp-unsigned-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-unsigned-64.c b/login/tst-utmp-unsigned-64.c
new file mode 100644
index 0000000000..940e7654f8
--- /dev/null
+++ b/login/tst-utmp-unsigned-64.c
@@ -0,0 +1 @@
+#include "tst-utmp-unsigned.c"
diff --git a/login/tst-utmp-unsigned.c b/login/tst-utmp-unsigned.c
new file mode 100644
index 0000000000..27ad03a7d6
--- /dev/null
+++ b/login/tst-utmp-unsigned.c
@@ -0,0 +1,40 @@
+/* Check that struct utmp, struct utmpx, struct lastlog use unsigned epoch.
+   Copyright (C) 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/>.  */
+
+#include <utmp.h>
+#include <utmpx.h>
+#include <utmp-size.h>
+
+/* Undefined.  Used to check that the conditions below are optimized away.  */
+void link_failure_utmp (void);
+void link_failure_utmpx (void);
+void link_failure_lastlog (void);
+
+static int
+do_test (void)
+{
+  if ((struct utmp) { .ut_tv = { 0x80000000U, }, }.ut_tv.tv_sec <= 0)
+    link_failure_utmp ();
+  if ((struct utmpx) { .ut_tv = { 0x80000000U, }, }.ut_tv.tv_sec <= 0)
+    link_failure_utmpx ();
+  if ((struct lastlog) { .ll_time = 0x80000000U, }.ll_time <= 0)
+    link_failure_lastlog ();
+  return 0;
+}
+
+#include <support/test-driver.c>
diff --git a/sysdeps/gnu/bits/utmpx.h b/sysdeps/gnu/bits/utmpx.h
index 34b4afbc6a..ed0df9bd81 100644
--- a/sysdeps/gnu/bits/utmpx.h
+++ b/sysdeps/gnu/bits/utmpx.h
@@ -74,7 +74,7 @@ struct utmpx
   __int32_t ut_session;		/* Session ID, used for windowing.  */
   struct
   {
-    __int32_t tv_sec;		/* Seconds.  */
+    __uint32_t tv_sec;		/* Seconds.  */
     __int32_t tv_usec;		/* Microseconds.  */
   } ut_tv;			/* Time entry was made.  */
 #else
-- 
2.44.0


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v3 1/3] login: Check default sizes of structs utmp, utmpx, lastlog
  2024-04-10  6:45 ` [PATCH v3 1/3] login: Check default sizes of structs utmp, utmpx, lastlog Florian Weimer
@ 2024-04-12 16:14   ` Adhemerval Zanella Netto
  0 siblings, 0 replies; 10+ messages in thread
From: Adhemerval Zanella Netto @ 2024-04-12 16:14 UTC (permalink / raw)
  To: libc-alpha, Florian Weimer



On 10/04/24 03:45, Florian Weimer wrote:
> The default <utmp-size.h> is for ports with a 64-bit time_t.
> Ports with a 32-bit time_t or with __WORDSIZE_TIME64_COMPAT32=1
> need to override it.

LGTM, thanks.

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

> ---
>  login/Makefile                 |  2 +-
>  login/tst-utmp-size.c          | 33 +++++++++++++++++++++++++++++++++
>  sysdeps/arc/utmp-size.h        |  3 +++
>  sysdeps/arm/utmp-size.h        |  2 ++
>  sysdeps/csky/utmp-size.h       |  2 ++
>  sysdeps/generic/utmp-size.h    | 23 +++++++++++++++++++++++
>  sysdeps/hppa/utmp-size.h       |  2 ++
>  sysdeps/m68k/utmp-size.h       |  3 +++
>  sysdeps/microblaze/utmp-size.h |  2 ++
>  sysdeps/mips/utmp-size.h       |  2 ++
>  sysdeps/nios2/utmp-size.h      |  2 ++
>  sysdeps/or1k/utmp-size.h       |  3 +++
>  sysdeps/powerpc/utmp-size.h    |  2 ++
>  sysdeps/riscv/utmp-size.h      |  2 ++
>  sysdeps/sh/utmp-size.h         |  2 ++
>  sysdeps/sparc/utmp-size.h      |  2 ++
>  sysdeps/x86/utmp-size.h        |  2 ++
>  17 files changed, 88 insertions(+), 1 deletion(-)
>  create mode 100644 login/tst-utmp-size.c
>  create mode 100644 sysdeps/arc/utmp-size.h
>  create mode 100644 sysdeps/arm/utmp-size.h
>  create mode 100644 sysdeps/csky/utmp-size.h
>  create mode 100644 sysdeps/generic/utmp-size.h
>  create mode 100644 sysdeps/hppa/utmp-size.h
>  create mode 100644 sysdeps/m68k/utmp-size.h
>  create mode 100644 sysdeps/microblaze/utmp-size.h
>  create mode 100644 sysdeps/mips/utmp-size.h
>  create mode 100644 sysdeps/nios2/utmp-size.h
>  create mode 100644 sysdeps/or1k/utmp-size.h
>  create mode 100644 sysdeps/powerpc/utmp-size.h
>  create mode 100644 sysdeps/riscv/utmp-size.h
>  create mode 100644 sysdeps/sh/utmp-size.h
>  create mode 100644 sysdeps/sparc/utmp-size.h
>  create mode 100644 sysdeps/x86/utmp-size.h
> 
> diff --git a/login/Makefile b/login/Makefile
> index 1e22008a61..b26ac42bfc 100644
> --- a/login/Makefile
> +++ b/login/Makefile
> @@ -44,7 +44,7 @@ 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-pututxline-lockfail tst-pututxline-cache tst-utmp-size
>  
>  # Empty compatibility library for old binaries.
>  extra-libs      := libutil
> diff --git a/login/tst-utmp-size.c b/login/tst-utmp-size.c
> new file mode 100644
> index 0000000000..1b7f7ff042
> --- /dev/null
> +++ b/login/tst-utmp-size.c
> @@ -0,0 +1,33 @@
> +/* Check expected sizes of struct utmp, struct utmpx, struct lastlog.
> +   Copyright (C) 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/>.  */
> +
> +#include <utmp.h>
> +#include <utmpx.h>
> +#include <utmp-size.h>
> +
> +static int
> +do_test (void)
> +{
> +  _Static_assert (sizeof (struct utmp) == UTMP_SIZE, "struct utmp size");
> +  _Static_assert (sizeof (struct utmpx) == UTMP_SIZE, "struct utmpx size");
> +  _Static_assert (sizeof (struct lastlog) == LASTLOG_SIZE,
> +                  "struct lastlog size");
> +  return 0;
> +}
> +
> +#include <support/test-driver.c>
> diff --git a/sysdeps/arc/utmp-size.h b/sysdeps/arc/utmp-size.h
> new file mode 100644
> index 0000000000..a247fcd3da
> --- /dev/null
> +++ b/sysdeps/arc/utmp-size.h
> @@ -0,0 +1,3 @@
> +/* arc has less padding than other architectures with 64-bit time_t.  */
> +#define UTMP_SIZE 392
> +#define LASTLOG_SIZE 296
> diff --git a/sysdeps/arm/utmp-size.h b/sysdeps/arm/utmp-size.h
> new file mode 100644
> index 0000000000..8f21ebe1b6
> --- /dev/null
> +++ b/sysdeps/arm/utmp-size.h
> @@ -0,0 +1,2 @@
> +#define UTMP_SIZE 384
> +#define LASTLOG_SIZE 292
> diff --git a/sysdeps/csky/utmp-size.h b/sysdeps/csky/utmp-size.h
> new file mode 100644
> index 0000000000..8f21ebe1b6
> --- /dev/null
> +++ b/sysdeps/csky/utmp-size.h
> @@ -0,0 +1,2 @@
> +#define UTMP_SIZE 384
> +#define LASTLOG_SIZE 292
> diff --git a/sysdeps/generic/utmp-size.h b/sysdeps/generic/utmp-size.h
> new file mode 100644
> index 0000000000..89dbe878b0
> --- /dev/null
> +++ b/sysdeps/generic/utmp-size.h
> @@ -0,0 +1,23 @@
> +/* Expected sizes of utmp-related structures stored in files.  64-bit version.
> +   Copyright (C) 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/>.  */
> +
> +/* Expected size, in bytes, of struct utmp and struct utmpx.  */
> +#define UTMP_SIZE 400
> +
> +/* Expected size, in bytes, of struct lastlog.  */
> +#define LASTLOG_SIZE 296
> diff --git a/sysdeps/hppa/utmp-size.h b/sysdeps/hppa/utmp-size.h
> new file mode 100644
> index 0000000000..8f21ebe1b6
> --- /dev/null
> +++ b/sysdeps/hppa/utmp-size.h
> @@ -0,0 +1,2 @@
> +#define UTMP_SIZE 384
> +#define LASTLOG_SIZE 292
> diff --git a/sysdeps/m68k/utmp-size.h b/sysdeps/m68k/utmp-size.h
> new file mode 100644
> index 0000000000..5946685819
> --- /dev/null
> +++ b/sysdeps/m68k/utmp-size.h
> @@ -0,0 +1,3 @@
> +/* m68k has 2-byte alignment.  */
> +#define UTMP_SIZE 382
> +#define LASTLOG_SIZE 292
> diff --git a/sysdeps/microblaze/utmp-size.h b/sysdeps/microblaze/utmp-size.h
> new file mode 100644
> index 0000000000..8f21ebe1b6
> --- /dev/null
> +++ b/sysdeps/microblaze/utmp-size.h
> @@ -0,0 +1,2 @@
> +#define UTMP_SIZE 384
> +#define LASTLOG_SIZE 292
> diff --git a/sysdeps/mips/utmp-size.h b/sysdeps/mips/utmp-size.h
> new file mode 100644
> index 0000000000..8f21ebe1b6
> --- /dev/null
> +++ b/sysdeps/mips/utmp-size.h
> @@ -0,0 +1,2 @@
> +#define UTMP_SIZE 384
> +#define LASTLOG_SIZE 292
> diff --git a/sysdeps/nios2/utmp-size.h b/sysdeps/nios2/utmp-size.h
> new file mode 100644
> index 0000000000..8f21ebe1b6
> --- /dev/null
> +++ b/sysdeps/nios2/utmp-size.h
> @@ -0,0 +1,2 @@
> +#define UTMP_SIZE 384
> +#define LASTLOG_SIZE 292
> diff --git a/sysdeps/or1k/utmp-size.h b/sysdeps/or1k/utmp-size.h
> new file mode 100644
> index 0000000000..6b3653aa4d
> --- /dev/null
> +++ b/sysdeps/or1k/utmp-size.h
> @@ -0,0 +1,3 @@
> +/* or1k has less padding than other architectures with 64-bit time_t.  */
> +#define UTMP_SIZE 392
> +#define LASTLOG_SIZE 296
> diff --git a/sysdeps/powerpc/utmp-size.h b/sysdeps/powerpc/utmp-size.h
> new file mode 100644
> index 0000000000..8f21ebe1b6
> --- /dev/null
> +++ b/sysdeps/powerpc/utmp-size.h
> @@ -0,0 +1,2 @@
> +#define UTMP_SIZE 384
> +#define LASTLOG_SIZE 292
> diff --git a/sysdeps/riscv/utmp-size.h b/sysdeps/riscv/utmp-size.h
> new file mode 100644
> index 0000000000..8f21ebe1b6
> --- /dev/null
> +++ b/sysdeps/riscv/utmp-size.h
> @@ -0,0 +1,2 @@
> +#define UTMP_SIZE 384
> +#define LASTLOG_SIZE 292
> diff --git a/sysdeps/sh/utmp-size.h b/sysdeps/sh/utmp-size.h
> new file mode 100644
> index 0000000000..8f21ebe1b6
> --- /dev/null
> +++ b/sysdeps/sh/utmp-size.h
> @@ -0,0 +1,2 @@
> +#define UTMP_SIZE 384
> +#define LASTLOG_SIZE 292
> diff --git a/sysdeps/sparc/utmp-size.h b/sysdeps/sparc/utmp-size.h
> new file mode 100644
> index 0000000000..8f21ebe1b6
> --- /dev/null
> +++ b/sysdeps/sparc/utmp-size.h
> @@ -0,0 +1,2 @@
> +#define UTMP_SIZE 384
> +#define LASTLOG_SIZE 292
> diff --git a/sysdeps/x86/utmp-size.h b/sysdeps/x86/utmp-size.h
> new file mode 100644
> index 0000000000..8f21ebe1b6
> --- /dev/null
> +++ b/sysdeps/x86/utmp-size.h
> @@ -0,0 +1,2 @@
> +#define UTMP_SIZE 384
> +#define LASTLOG_SIZE 292

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v3 2/3] login: structs utmp, utmpx, lastlog _TIME_BITS independence (bug 30701)
  2024-04-10  6:45 ` [PATCH v3 2/3] login: structs utmp, utmpx, lastlog _TIME_BITS independence (bug 30701) Florian Weimer
@ 2024-04-12 16:15   ` Adhemerval Zanella Netto
  2024-04-12 21:23   ` Paul Eggert
  1 sibling, 0 replies; 10+ messages in thread
From: Adhemerval Zanella Netto @ 2024-04-12 16:15 UTC (permalink / raw)
  To: Florian Weimer, libc-alpha



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

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v3 3/3] login: Use unsigned 32-bit types for seconds-since-epoch
  2024-04-10  6:45 ` [PATCH v3 3/3] login: Use unsigned 32-bit types for seconds-since-epoch Florian Weimer
@ 2024-04-12 16:19   ` Adhemerval Zanella Netto
  0 siblings, 0 replies; 10+ messages in thread
From: Adhemerval Zanella Netto @ 2024-04-12 16:19 UTC (permalink / raw)
  To: libc-alpha, Florian Weimer



On 10/04/24 03:45, Florian Weimer wrote:
> These fields store timestamps when the system was running.  No Linux
> systems existed before 1970, so these values are unused.  Switching
> to unsigned types allows continued use of the existing struct layouts
> beyond the year 2038.
> 
> The intent is to give distributions more time to switch to improved
> interfaces that also avoid locking/data corruption issues.

LGTM, thanks.

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

> ---
>  NEWS                         |  9 +++++++-
>  bits/utmp.h                  |  4 ++--
>  login/Makefile               |  4 +++-
>  login/tst-utmp-unsigned-64.c |  1 +
>  login/tst-utmp-unsigned.c    | 40 ++++++++++++++++++++++++++++++++++++
>  sysdeps/gnu/bits/utmpx.h     |  2 +-
>  6 files changed, 55 insertions(+), 5 deletions(-)
>  create mode 100644 login/tst-utmp-unsigned-64.c
>  create mode 100644 login/tst-utmp-unsigned.c
> 
> diff --git a/NEWS b/NEWS
> index da4b2223e9..cf6078cf20 100644
> --- a/NEWS
> +++ b/NEWS
> @@ -28,7 +28,14 @@ Major new features:
>  
>  Deprecated and removed features, and other changes affecting compatibility:
>  
> -  [Add deprecations, removals and changes affecting compatibility here]
> +* Architectures which use a 32-bit seconds-since-epoch field in struct
> +  lastlog, struct utmp, struct utmpx (such as i386, powerpc64le, rv32,
> +  rv64, x86-64) switched from a signed to an unsigned type for that
> +  field.  This allows these fields to store timestamps beyond the year
> +  2038, until the year 2106.  Please note that applications are still
> +  expected to migrate off the interfaces declared in <utmp.h> and
> +  <utmpx.h> (except for login_tty) due to locking and session management
> +  problems.
>  
>  Changes to build and runtime requirements:
>  
> diff --git a/bits/utmp.h b/bits/utmp.h
> index f2d1c13d8c..27cb536800 100644
> --- a/bits/utmp.h
> +++ b/bits/utmp.h
> @@ -36,7 +36,7 @@
>  struct lastlog
>    {
>  #if __WORDSIZE_TIME64_COMPAT32
> -    int32_t ll_time;
> +    __uint32_t ll_time;
>  #else
>      __time_t ll_time;
>  #endif
> @@ -76,7 +76,7 @@ struct utmp
>    int32_t ut_session;		/* Session ID, used for windowing.  */
>    struct
>    {
> -    int32_t tv_sec;		/* Seconds.  */
> +    __uint32_t tv_sec;		/* Seconds.  */
>      int32_t tv_usec;		/* Microseconds.  */
>    } ut_tv;			/* Time entry was made.  */
>  #else
> diff --git a/login/Makefile b/login/Makefile
> index f91190e3dc..84563230ef 100644
> --- a/login/Makefile
> +++ b/login/Makefile
> @@ -44,9 +44,11 @@ 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-utmp-size-64
> +  tst-pututxline-lockfail tst-pututxline-cache tst-utmp-size tst-utmp-size-64 \
> +  tst-utmp-unsigned tst-utmp-unsigned-64
>  
>  CFLAGS-tst-utmp-size-64.c += -D_FILE_OFFSET_BITS=64 -D_TIME_BITS=64
> +CFLAGS-tst-utmp-unsigned-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-unsigned-64.c b/login/tst-utmp-unsigned-64.c
> new file mode 100644
> index 0000000000..940e7654f8
> --- /dev/null
> +++ b/login/tst-utmp-unsigned-64.c
> @@ -0,0 +1 @@
> +#include "tst-utmp-unsigned.c"
> diff --git a/login/tst-utmp-unsigned.c b/login/tst-utmp-unsigned.c
> new file mode 100644
> index 0000000000..27ad03a7d6
> --- /dev/null
> +++ b/login/tst-utmp-unsigned.c
> @@ -0,0 +1,40 @@
> +/* Check that struct utmp, struct utmpx, struct lastlog use unsigned epoch.
> +   Copyright (C) 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/>.  */
> +
> +#include <utmp.h>
> +#include <utmpx.h>
> +#include <utmp-size.h>
> +
> +/* Undefined.  Used to check that the conditions below are optimized away.  */
> +void link_failure_utmp (void);
> +void link_failure_utmpx (void);
> +void link_failure_lastlog (void);
> +
> +static int
> +do_test (void)
> +{
> +  if ((struct utmp) { .ut_tv = { 0x80000000U, }, }.ut_tv.tv_sec <= 0)
> +    link_failure_utmp ();
> +  if ((struct utmpx) { .ut_tv = { 0x80000000U, }, }.ut_tv.tv_sec <= 0)
> +    link_failure_utmpx ();
> +  if ((struct lastlog) { .ll_time = 0x80000000U, }.ll_time <= 0)
> +    link_failure_lastlog ();
> +  return 0;
> +}
> +
> +#include <support/test-driver.c>
> diff --git a/sysdeps/gnu/bits/utmpx.h b/sysdeps/gnu/bits/utmpx.h
> index 34b4afbc6a..ed0df9bd81 100644
> --- a/sysdeps/gnu/bits/utmpx.h
> +++ b/sysdeps/gnu/bits/utmpx.h
> @@ -74,7 +74,7 @@ struct utmpx
>    __int32_t ut_session;		/* Session ID, used for windowing.  */
>    struct
>    {
> -    __int32_t tv_sec;		/* Seconds.  */
> +    __uint32_t tv_sec;		/* Seconds.  */
>      __int32_t tv_usec;		/* Microseconds.  */
>    } ut_tv;			/* Time entry was made.  */
>  #else

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v3 2/3] login: structs utmp, utmpx, lastlog _TIME_BITS independence (bug 30701)
  2024-04-10  6:45 ` [PATCH v3 2/3] login: structs utmp, utmpx, lastlog _TIME_BITS independence (bug 30701) Florian Weimer
  2024-04-12 16:15   ` Adhemerval Zanella Netto
@ 2024-04-12 21:23   ` Paul Eggert
  2024-04-15  9:28     ` Florian Weimer
  1 sibling, 1 reply; 10+ messages in thread
From: Paul Eggert @ 2024-04-12 21:23 UTC (permalink / raw)
  To: Florian Weimer, libc-alpha

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.

^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v3 2/3] login: structs utmp, utmpx, lastlog _TIME_BITS independence (bug 30701)
  2024-04-12 21:23   ` Paul Eggert
@ 2024-04-15  9:28     ` Florian Weimer
  2024-04-17 21:14       ` Paul Eggert
  0 siblings, 1 reply; 10+ messages in thread
From: Florian Weimer @ 2024-04-15  9:28 UTC (permalink / raw)
  To: Paul Eggert; +Cc: libc-alpha

* 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


^ permalink raw reply	[flat|nested] 10+ messages in thread

* Re: [PATCH v3 2/3] login: structs utmp, utmpx, lastlog _TIME_BITS independence (bug 30701)
  2024-04-15  9:28     ` Florian Weimer
@ 2024-04-17 21:14       ` Paul Eggert
  0 siblings, 0 replies; 10+ messages in thread
From: Paul Eggert @ 2024-04-17 21:14 UTC (permalink / raw)
  To: Florian Weimer; +Cc: libc-alpha

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.

^ permalink raw reply	[flat|nested] 10+ messages in thread

end of thread, other threads:[~2024-04-17 21:14 UTC | newest]

Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-04-10  6:45 [PATCH v3 0/3] login: Use unsigned 32-bit types for seconds-since-epoch Florian Weimer
2024-04-10  6:45 ` [PATCH v3 1/3] login: Check default sizes of structs utmp, utmpx, lastlog Florian Weimer
2024-04-12 16:14   ` Adhemerval Zanella Netto
2024-04-10  6:45 ` [PATCH v3 2/3] login: structs utmp, utmpx, lastlog _TIME_BITS independence (bug 30701) Florian Weimer
2024-04-12 16:15   ` Adhemerval Zanella Netto
2024-04-12 21:23   ` Paul Eggert
2024-04-15  9:28     ` Florian Weimer
2024-04-17 21:14       ` Paul Eggert
2024-04-10  6:45 ` [PATCH v3 3/3] login: Use unsigned 32-bit types for seconds-since-epoch Florian Weimer
2024-04-12 16:19   ` Adhemerval Zanella Netto

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).