glibc/sysdeps
Lukasz Majewski f5b6fd258b y2038: linux: Provide __utimensat64 implementation
This patch provides new __utimensat64 explicit 64 bit function for
setting access and modification time of a file. Moreover, a 32 bit version
- __utimensat has been refactored to internally use __utimensat64.

The __utimensat is now supposed to be used on systems still supporting
32 bit time (__TIMESIZE != 64) - hence the necessary conversions to 64 bit
struct __timespec64.
When pointer to struct __timespec64 is NULL - the file access and modification
time is set to the current one and no conversions from struct timespec to
__timespec64 are performed.

The new utimensat_time64 syscall available from Linux 5.1+ has been used,
when applicable.
The new helper function - __utimensat64_helper - has been introduced to
facilitate code re-usage on function providing futimens syscall handling.
The Linux kernel checks if passed tv_nsec value overflows, so there is no
need to repeat it in glibc.
When utimensat syscall on systems supporting 32 bit time ABI is used,
the check is performed if passed data (which may have 64 bit tv_sec) fits
into 32 bit range.

Build tests:
- The code has been tested on x86_64/x86 (native compilation):
make PARALLELMFLAGS="-j8" && make xcheck PARALLELMFLAGS="-j8"

- The glibc has been build tested (make PARALLELMFLAGS="-j8") for
x86 (i386), x86_64-x32, and armv7

Run-time tests:
- Run specific tests on ARM/x86 32bit systems (qemu):
https://github.com/lmajewski/meta-y2038 and run tests:
https://github.com/lmajewski/y2038-tests/commits/master

- Use of cross-test-ssh.sh for ARM (armv7):
make PARALLELMFLAGS="-j8" test-wrapper='./cross-test-ssh.sh root@192.168.7.2' xcheck

Linux kernel, headers and minimal kernel version for glibc build test
matrix:
- Linux v5.1 (with utimensat_time64) and glibc build with v5.1 as
minimal kernel version (--enable-kernel="5.1.0")
The __ASSUME_TIME64_SYSCALLS flag defined.

- Linux v5.1 and default minimal kernel version
The __ASSUME_TIME64_SYSCALLS not defined, but kernel supports utimensat_time64
syscall.

- Linux v4.19 (no utimensat_time64 support) with default minimal kernel
version for contemporary glibc
This kernel doesn't support utimensat_time64 syscall, so the fallback
to utimensat is tested.

The above tests were performed with Y2038 redirection applied as well as
without (so the __TIMESIZE != 64 execution path is checked as well).

No regressions were observed.
2019-11-02 08:41:25 +01:00
..
aarch64 Split up endian.h to minimize exposure of BYTE_ORDER. 2019-10-01 14:54:46 -07:00
alpha Split up endian.h to minimize exposure of BYTE_ORDER. 2019-10-01 14:54:46 -07:00
arm Split up endian.h to minimize exposure of BYTE_ORDER. 2019-10-01 14:54:46 -07:00
csky Split up endian.h to minimize exposure of BYTE_ORDER. 2019-10-01 14:54:46 -07:00
generic Remove pause and nanosleep not cancel wrappers 2019-10-31 11:09:06 -03:00
gnu Add TCP_TX_DELAY from Linux 5.3 to netinet/tcp.h. 2019-09-27 13:37:36 +00:00
hppa Split up endian.h to minimize exposure of BYTE_ORDER. 2019-10-01 14:54:46 -07:00
htl time: Introduce function to check correctness of nanoseconds value 2019-10-27 21:49:25 +01:00
hurd Prefer https to http for gnu.org and fsf.org URLs 2019-09-07 02:43:31 -07:00
i386 Prefer https to http for gnu.org and fsf.org URLs 2019-09-07 02:43:31 -07:00
ia64 Remove math-finite.h 2019-10-21 08:47:07 -03:00
ieee754 Split up endian.h to minimize exposure of BYTE_ORDER. 2019-10-01 14:54:46 -07:00
init_array Prefer https to http for gnu.org and fsf.org URLs 2019-09-07 02:43:31 -07:00
m68k Split up endian.h to minimize exposure of BYTE_ORDER. 2019-10-01 14:54:46 -07:00
mach Use clock_gettime to implement gettimeofday. 2019-10-30 17:11:10 -03:00
microblaze Split up endian.h to minimize exposure of BYTE_ORDER. 2019-10-01 14:54:46 -07:00
mips Split up endian.h to minimize exposure of BYTE_ORDER. 2019-10-01 14:54:46 -07:00
nios2 Split up endian.h to minimize exposure of BYTE_ORDER. 2019-10-01 14:54:46 -07:00
nptl nptl: Add pthread_clockjoin_np 2019-11-01 11:23:43 -03:00
posix Use clock_gettime to implement gettimeofday. 2019-10-30 17:11:10 -03:00
powerpc [powerpc] No need to enter "Ignore Exceptions Mode" 2019-10-02 10:30:51 -05:00
pthread Change most internal uses of __gettimeofday to __clock_gettime. 2019-10-30 17:04:10 -03:00
riscv Split up endian.h to minimize exposure of BYTE_ORDER. 2019-10-01 14:54:46 -07:00
s390 S390: Add new s390 platform z15. 2019-10-18 14:57:14 +02:00
sh Split up endian.h to minimize exposure of BYTE_ORDER. 2019-10-01 14:54:46 -07:00
sparc nptl: Replace non cancellable pause/nanosleep with futex 2019-10-31 11:09:01 -03:00
unix y2038: linux: Provide __utimensat64 implementation 2019-11-02 08:41:25 +01:00
wordsize-32 Prefer https to http for gnu.org and fsf.org URLs 2019-09-07 02:43:31 -07:00
wordsize-64 Prefer https to http for gnu.org and fsf.org URLs 2019-09-07 02:43:31 -07:00
x86 elf: Use nocancel pread64() instead of lseek()+read() 2019-10-18 15:55:33 -04:00
x86_64 Remove x64 _finite tests and references 2019-10-21 14:29:12 -03:00