mbox series

[v7,0/2] Support y2038 semctl_syscall()

Message ID 20200505154736.1010242-1-alistair.francis@wdc.com
Headers show
Series Support y2038 semctl_syscall() | expand

Message

Alistair Francis May 5, 2020, 3:47 p.m. UTC
This series adds a new __semid_ds32 that is passed to the kernel
(as part of a union) when running on 32-bit systems. If we are doing an
IPC_STAT/SEM_STAT command then the 32-bit sem_{c,o}time{_high} values
are combined to create a 64-bit value.

The semctl_syscall() function passes a union semun to the kernel. The
union includes struct semid_ds as a member. On 32-bit architectures the
Linux kernel provides a *_high version of the 32-bit sem_otime and
sem_ctime values. These can be combined to get a 64-bit version of the
time.

This patch adjusts the struct semid_ds to support the *_high versions
of sem_otime and sem_ctime. For 32-bit systems with a 64-bit time_t
this can be used to get a 64-bit time from the two 32-bit values.

This series was tested by running:
  ./scripts/build-many-glibcs.py ... compilers
  ./scripts/build-many-glibcs.py ... glibcs
on my x86_64 machine.

I also ran make check on RV32 and I only see a total of 9 test failures.

v7:
 - Re-write based on code from Adhemerval.
v6:
 - Update the 3rd patch to pass a temp buffer to the kernel
v5:
 - Address v4 review comments
 - Set the semid_ds struct from a temp struct
v4:
 - Remove the __IPC_TIME64 macro
    - It was only used once and doesn't work if __IPC_64 is 0 (which is
      usually is)
 - Address failures pointed out by Vineet Gupta

Alistair Francis (2):
  sysv: linux: Define the __semid_ds32 struct
  sysv: linux: Pass 64-bit version of semctl syscall

 bits/ipctypes.h                               |  10 ++
 sysdeps/mips/bits/ipctypes.h                  |  10 ++
 sysdeps/unix/sysv/linux/bits/ipc.h            |   3 +-
 sysdeps/unix/sysv/linux/bits/sem.h            |   4 +-
 .../unix/sysv/linux/hppa/struct__semid_ds32.h |  30 +++++
 sysdeps/unix/sysv/linux/ipc_priv.h            |   4 +
 .../unix/sysv/linux/mips/struct__semid_ds32.h |  28 ++++
 .../sysv/linux/powerpc/struct__semid_ds32.h   |  30 +++++
 sysdeps/unix/sysv/linux/semctl.c              | 121 +++++++++++++++---
 .../sysv/linux/sparc/struct__semid_ds32.h     |  30 +++++
 sysdeps/unix/sysv/linux/struct__semid_ds32.h  |  30 +++++
 sysdeps/unix/sysv/linux/x86/bits/ipctypes.h   |  13 ++
 .../unix/sysv/linux/x86/struct__semid_ds32.h  |  30 +++++
 13 files changed, 319 insertions(+), 24 deletions(-)
 create mode 100644 sysdeps/unix/sysv/linux/hppa/struct__semid_ds32.h
 create mode 100644 sysdeps/unix/sysv/linux/mips/struct__semid_ds32.h
 create mode 100644 sysdeps/unix/sysv/linux/powerpc/struct__semid_ds32.h
 create mode 100644 sysdeps/unix/sysv/linux/sparc/struct__semid_ds32.h
 create mode 100644 sysdeps/unix/sysv/linux/struct__semid_ds32.h
 create mode 100644 sysdeps/unix/sysv/linux/x86/struct__semid_ds32.h