bug-gnulib@gnu.org mirror (unofficial)
 help / color / mirror / Atom feed
* utimensat: Fix test failures on macOS
@ 2021-01-02 18:35 Bruno Haible
  0 siblings, 0 replies; only message in thread
From: Bruno Haible @ 2021-01-02 18:35 UTC (permalink / raw)
  To: bug-gnulib

On macOS 10.13, I'm seeing test failures:

FAIL: test-fdutimensat
======================

./test-utimens.h:75: assertion 'func (BASE "file", ts) == -1' failed
FAIL test-fdutimensat (exit status: 134)

FAIL: test-utimensat
====================

./test-utimens.h:75: assertion 'func (BASE "file", ts) == -1' failed
FAIL test-utimensat (exit status: 134)

Once I add the validation of the tv_nsec values to the Gnulib code, another
failure remains:

FAIL: test-fdutimensat
======================

./test-utimens.h:164: assertion 'func (BASE "link/", NULL) == -1' failed
FAIL test-fdutimensat (exit status: 134)

FAIL: test-utimensat
====================

./test-utimens.h:164: assertion 'func (BASE "link/", NULL) == -1' failed
FAIL test-utimensat (exit status: 134)

A missing recognition of a trailing slash, like in the previous patch.


This patch fixes both issues:


2021-01-02  Bruno Haible  <bruno@clisp.org>

	utimensat: Fix test failures on macOS 10.13.
	* lib/utimensat.c: Include <string.h>, <sys/stat.h>.
	(rpl_utimensat): Check against invalid tv_nsec values. Before calling
	utimensat, recognize a filename ending in a slash that does not point
	to a directory.

diff --git a/lib/utimensat.c b/lib/utimensat.c
index 2cea64f..1daff88 100644
--- a/lib/utimensat.c
+++ b/lib/utimensat.c
@@ -24,6 +24,8 @@
 #include <errno.h>
 #include <fcntl.h>
 #include <stdlib.h>
+#include <string.h>
+#include <sys/stat.h>
 
 #include "stat-time.h"
 #include "timespec.h"
@@ -106,6 +108,34 @@ rpl_utimensat (int fd, char const *file, struct timespec const times[2],
         }
 #  endif
 # endif
+# if defined __APPLE__ && defined __MACH__
+      /* macOS 10.13 does not reject invalid tv_nsec values either.  */
+      if (times
+          && ((times[0].tv_nsec != UTIME_OMIT
+               && times[0].tv_nsec != UTIME_NOW
+               && ! (0 <= times[0].tv_nsec
+                     && times[0].tv_nsec < TIMESPEC_HZ))
+              || (times[1].tv_nsec != UTIME_OMIT
+                  && times[1].tv_nsec != UTIME_NOW
+                  && ! (0 <= times[1].tv_nsec
+                        && times[1].tv_nsec < TIMESPEC_HZ))))
+        {
+          errno = EINVAL;
+          return -1;
+        }
+      size_t len = strlen (file);
+      if (len > 0 && file[len - 1] == '/')
+        {
+          struct stat statbuf;
+          if (fstatat (fd, file, &statbuf, 0) < 0)
+            return -1;
+          if (!S_ISDIR (statbuf.st_mode))
+            {
+              errno = ENOTDIR;
+              return -1;
+            }
+        }
+# endif
       result = utimensat (fd, file, times, flag);
       /* Linux kernel 2.6.25 has a bug where it returns EINVAL for
          UTIME_NOW or UTIME_OMIT with non-zero tv_sec, which



^ permalink raw reply related	[flat|nested] only message in thread

only message in thread, other threads:[~2021-01-02 18:36 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-01-02 18:35 utimensat: Fix test failures on macOS Bruno Haible

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).