Skip to content

Commit

Permalink
y2038: linux: Provide __utime64 implementation
Browse files Browse the repository at this point in the history
This patch replaces auto generated wrapper (as described in
sysdeps/unix/sysv/linux/syscalls.list) for utime with one which adds extra
support for setting file's access and modification 64 bit time on machines
with __TIMESIZE != 64.

Internally, the __utimensat_time64 helper function is used. This patch is
necessary for having architectures with __WORDSIZE == 32 && __TIMESIZE != 64
Y2038 safe.

Moreover, a 32 bit version - __utime has been refactored to internally use
__utime64.
The __utime is now supposed to be used on systems still supporting 32
bit time (__TIMESIZE != 64) - hence the necessary conversion between struct
utimbuf and struct __utimbuf64.

Build tests:
./src/scripts/build-many-glibcs.py glibcs

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

Above tests were performed with Y2038 redirection applied as well as
without to test proper usage of both __utime64 and __utime.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
  • Loading branch information
Lukasz Majewski committed Feb 21, 2020
1 parent 226ac16 commit 2f72ea2
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 1 deletion.
3 changes: 3 additions & 0 deletions include/time.h
Expand Up @@ -214,9 +214,12 @@ libc_hidden_proto (__clock_getres64);
#endif

#if __TIMESIZE == 64
# define __utime64 __utime
# define __utimes64 __utimes
# define __utimensat64 __utimensat
#else
extern int __utime64 (const char *file, const struct __utimbuf64 *times);
libc_hidden_proto (__utime64)
extern int __utimes64 (const char *file, const struct __timeval64 tvp[2]);
libc_hidden_proto (__utimes64)
extern int __utimensat64 (int fd, const char *file,
Expand Down
1 change: 0 additions & 1 deletion sysdeps/unix/sysv/linux/syscalls.list
Expand Up @@ -65,7 +65,6 @@ swapon - swapon i:si __swapon swapon
swapoff - swapoff i:s __swapoff swapoff
unshare EXTRA unshare i:i unshare
uselib EXTRA uselib i:s __compat_uselib uselib@GLIBC_2.0:GLIBC_2.23
utime - utime i:sP utime

chown - chown i:sii __libc_chown __chown chown

Expand Down
56 changes: 56 additions & 0 deletions sysdeps/unix/sysv/linux/utime.c
@@ -0,0 +1,56 @@
/* utime -- Change access and modification times of file. Linux version.
Copyright (C) 2020 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 <utime.h>
#include <time.h>

int
__utime64 (const char *file, const struct __utimbuf64 *times)
{
struct __timespec64 ts64[2];

if (times != NULL)
{
ts64[0].tv_sec = times->actime;
ts64[0].tv_nsec = 0LL;
ts64[1].tv_sec = times->modtime;
ts64[1].tv_nsec = 0LL;
}

return __utimensat64_helper (0, file, times ? ts64 : NULL, 0);
}

#if __TIMESIZE != 64
libc_hidden_def (__utime64)

int
__utime (const char *file, const struct utimbuf *times)
{
struct __utimbuf64 utb64;

if (times != NULL)
{
utb64.actime = (__time64_t) times->actime;
utb64.modtime = (__time64_t) times->modtime;
}

return __utime64 (file, times ? &utb64 : NULL);
}
#endif
strong_alias (__utime, utime)
libc_hidden_def (utime)

0 comments on commit 2f72ea2

Please sign in to comment.