linux: Add {f}stat{at} y2038 support

System Internals / glibc - Adhemerval Zanella [linaro.org] - 9 October 2020 20:02 UTC

A new struct __stat{64}_t64 type is added with the required __timespec64 time definition. Only LFS is added, 64-bit time with 32-bit offsets is not supposed to be supported (no existing glibc configuration supports such a combination). It is done with an extra __NR_statx call plus a conversion to the new __stat{64}_t64 type. The statx call is done only for 32-bit time_t ABIs.

Internally some extra routines to copy from/to struct stat{64} to struct __stat{64} used on multiple implementations (stat, fstat, lstat, and fstatat) are added on a extra implementation (stat_t64_cp.c). Alse some extra routines to copy from statx to __stat{64} is added on statx_cp.c.

Checked with a build for all affected ABIs. I also checked on x86_64, i686, powerpc, powerpc64le, sparcv9, sparc64, s390, and s390x.

aa03f722f3 linux: Add {f}stat{at} y2038 support
include/sys/stat.h | 20 ++++++
sysdeps/generic/struct_stat_time64.h | 6 ++
sysdeps/unix/sysv/linux/Makefile | 2 +-
sysdeps/unix/sysv/linux/fstat64.c | 20 +++++-
sysdeps/unix/sysv/linux/fstatat64.c | 95 +++++++++++++++++++-------
sysdeps/unix/sysv/linux/lstat64.c | 19 +++++-
sysdeps/unix/sysv/linux/mips/mips64/kstat_cp.h | 17 ++---
sysdeps/unix/sysv/linux/mips/mips64/statx_cp.c | 3 -
sysdeps/unix/sysv/linux/stat64.c | 20 +++++-
sysdeps/unix/sysv/linux/stat_t64_cp.c | 56 +++++++++++++++
sysdeps/unix/sysv/linux/stat_t64_cp.h | 25 +++++++
sysdeps/unix/sysv/linux/statx_cp.c | 30 ++++++++
sysdeps/unix/sysv/linux/statx_cp.h | 3 +
sysdeps/unix/sysv/linux/struct_stat_time64.h | 85 +++++++++++++++++++++++
14 files changed, 354 insertions(+), 47 deletions(-)

Upstream: sourceware.org


  • Share