From 7e842de9d80ddd94abd61f529702b2e27f31c175 Mon Sep 17 00:00:00 2001 From: Collin Funk Date: Mon, 20 May 2024 14:23:41 -0700 Subject: [PATCH 1/2] utimensat, utimens: Work around NetBSD 10.0 bugs. * lib/utimens.c (fdutimens): Work around a NetBSD 10.0 UTIME_OMIT bug in the same way as Linux kernel 2.6.32 and Solaris 11.1. (lutimens): Likewise. * lib/utimensat.c (rpl_utimensat): Likewise. Workaround a NetBSD 10.0 bug where invalid tv_nsec values are not rejected in the same way as Linux kernel 2.6.22.19 on hppa. * doc/posix-functions/utimensat.texi: Document the invalid tv_nsec bug. --- ChangeLog | 11 +++++++++++ doc/posix-functions/utimensat.texi | 2 +- lib/utimens.c | 8 +++++--- lib/utimensat.c | 11 +++++++---- 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index 88258bec2c..5dd7fe7e69 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,14 @@ +2024-05-20 Collin Funk + + utimensat, utimens: Work around NetBSD 10.0 bugs. + * lib/utimens.c (fdutimens): Work around a NetBSD 10.0 UTIME_OMIT bug in + the same way as Linux kernel 2.6.32 and Solaris 11.1. + (lutimens): Likewise. + * lib/utimensat.c (rpl_utimensat): Likewise. Workaround a NetBSD 10.0 + bug where invalid tv_nsec values are not rejected in the same way as + Linux kernel 2.6.22.19 on hppa. + * doc/posix-functions/utimensat.texi: Document the invalid tv_nsec bug. + 2024-05-20 Paul Eggert byteswap: fix problem on macOS diff --git a/doc/posix-functions/utimensat.texi b/doc/posix-functions/utimensat.texi index d7b4f6914f..1ba560fb0a 100644 --- a/doc/posix-functions/utimensat.texi +++ b/doc/posix-functions/utimensat.texi @@ -35,7 +35,7 @@ @node utimensat @item Out-of-range values of @code{tv_nsec} do not lead to a failure on some platforms: -Linux kernel 2.6.22.19 on hppa. +Linux kernel 2.6.22.19 on hppa, NetBSD 10.0. @item On some platforms, this function mis-handles a trailing slash: AIX 7.2. diff --git a/lib/utimens.c b/lib/utimens.c index 4bfb9c91a7..6b9f62a53c 100644 --- a/lib/utimens.c +++ b/lib/utimens.c @@ -220,7 +220,7 @@ fdutimens (int fd, char const *file, struct timespec const timespec[2]) if (0 <= utimensat_works_really) { int result; -# if __linux__ || __sun +# if defined __linux__ || defined __sun || defined __NetBSD__ /* As recently as Linux kernel 2.6.32 (Dec 2009), several file systems (xfs, ntfs-3g) have bugs with a single UTIME_OMIT, but work if both times are either explicitly specified or @@ -230,6 +230,7 @@ fdutimens (int fd, char const *file, struct timespec const timespec[2]) where UTIME_OMIT would have worked. The same bug occurs in Solaris 11.1 (Apr 2013). + The same bug occurs in NetBSD 10.0 (May 2024). FIXME: Simplify this in 2024, when these file system bugs are no longer common on Gnulib target platforms. */ @@ -440,7 +441,7 @@ fdutimens (int fd, char const *file, struct timespec const timespec[2]) # endif if (futimes (fd, t) == 0) { -# if __linux__ && __GLIBC__ +# if defined __linux__ && defined __GLIBC__ /* Work around a longstanding glibc bug, still present as of 2010-12-27. On older Linux kernels that lack both utimensat and utimes, glibc's futimes rounds instead of @@ -553,7 +554,7 @@ lutimens (char const *file, struct timespec const timespec[2]) if (0 <= lutimensat_works_really) { int result; -# if __linux__ || __sun +# if defined __linux__ || defined __sun || defined __NetBSD__ /* As recently as Linux kernel 2.6.32 (Dec 2009), several file systems (xfs, ntfs-3g) have bugs with a single UTIME_OMIT, but work if both times are either explicitly specified or @@ -563,6 +564,7 @@ lutimens (char const *file, struct timespec const timespec[2]) UTIME_OMIT would have worked. The same bug occurs in Solaris 11.1 (Apr 2013). + The same bug occurs in NetBSD 10.0 (May 2024). FIXME: Simplify this for Linux in 2016 and for Solaris in 2024, when file system bugs are no longer common. */ diff --git a/lib/utimensat.c b/lib/utimensat.c index 1321264269..b44207b4be 100644 --- a/lib/utimensat.c +++ b/lib/utimensat.c @@ -77,7 +77,7 @@ rpl_utimensat (int fd, char const *file, struct timespec const times[2], int flag) # undef utimensat { -# if defined __linux__ || defined __sun +# if defined __linux__ || defined __sun || defined __NetBSD__ struct timespec ts[2]; # endif @@ -86,7 +86,7 @@ rpl_utimensat (int fd, char const *file, struct timespec const times[2], if (0 <= utimensat_works_really) { int result; -# if defined __linux__ || defined __sun +# if defined __linux__ || defined __sun || defined __NetBSD__ struct stat st; /* As recently as Linux kernel 2.6.32 (Dec 2009), several file systems (xfs, ntfs-3g) have bugs with a single UTIME_OMIT, @@ -97,6 +97,7 @@ rpl_utimensat (int fd, char const *file, struct timespec const times[2], UTIME_OMIT would have worked. The same bug occurs in Solaris 11.1 (Apr 2013). + The same bug occurs in NetBSD 10.0 (May 2024). FIXME: Simplify this in 2024, when these file system bugs are no longer common on Gnulib target platforms. */ @@ -117,9 +118,11 @@ rpl_utimensat (int fd, char const *file, struct timespec const times[2], ts[1] = times[1]; times = ts; } -# ifdef __hppa__ +# if defined __hppa__ || defined __NetBSD__ /* Linux kernel 2.6.22.19 on hppa does not reject invalid tv_nsec - values. */ + values. + + The same bug occurs in NetBSD 10.0 (May 2024). */ else if (times && ((times[0].tv_nsec != UTIME_NOW && ! (0 <= times[0].tv_nsec -- 2.45.1