]> git.ipfire.org Git - thirdparty/openssh-portable.git/commitdiff
Update utimensat test.
authorDarren Tucker <dtucker@dtucker.net>
Fri, 7 Jun 2019 13:47:37 +0000 (23:47 +1000)
committerDarren Tucker <dtucker@dtucker.net>
Fri, 7 Jun 2019 13:47:37 +0000 (23:47 +1000)
POSIX specifies that when given a symlink, AT_SYMLINK_NOFOLLOW should
update the symlink and not the destination.  The compat code doesn't
have a way to do this, so where possible it fails instead of following a
symlink when explicitly asked not to. Instead of checking for an explicit
failure, check that it does not update the destination, which both the
real and compat implmentations should honour.

Inspired by github pull req #125 from chutzpah at gentoo.org.

openbsd-compat/regress/utimensattest.c

index a7bc7634b5710577259cda93d52f47e0ea575889..b29cef2f12745faf07d6555f2e3d4ec4fe7e7e1e 100644 (file)
@@ -83,14 +83,28 @@ main(void)
                fail("mtim.tv_nsec", 45678000, sb.st_mtim.tv_nsec);
 #endif
 
+       /*
+        * POSIX specifies that when given a symlink, AT_SYMLINK_NOFOLLOW
+        * should update the symlink and not the destination.  The compat
+        * code doesn't have a way to do this, so where possible it fails
+        * with ENOSYS instead of following a symlink when explicitly asked
+        * not to.  Here we just test that it does not update the destination.
+        */
        if (rename(TMPFILE, TMPFILE2) == -1)
                fail("rename", 0, 0);
        if (symlink(TMPFILE2, TMPFILE) == -1)
                fail("symlink", 0, 0);
+       ts[0].tv_sec = 11223344;
+       ts[1].tv_sec = 55667788;
+       (void)utimensat(AT_FDCWD, TMPFILE, ts, AT_SYMLINK_NOFOLLOW);
+       if (stat(TMPFILE2, &sb) == -1)
+               fail("stat", 0, 0 );
+       if (sb.st_atime == 11223344)
+               fail("utimensat symlink st_atime", 0, 0 );
+       if (sb.st_mtime == 55667788)
+               fail("utimensat symlink st_mtime", 0, 0 );
 
-       if (utimensat(AT_FDCWD, TMPFILE, ts, AT_SYMLINK_NOFOLLOW) != -1)
-               fail("utimensat followed symlink", 0, 0);
-
+       /* Clean up */
        if (!(unlink(TMPFILE) == 0 && unlink(TMPFILE2) == 0))
                fail("unlink", 0, 0);
        exit(0);