utimens (fdutimens): ignore a negative FD, per contract
authorAurelien Jarno <aurelien@aurel32.net>
Wed, 6 Jan 2010 03:27:12 +0000 (20:27 -0700)
committerIan Beckwith <ianb@erislabs.net>
Sun, 10 Jan 2010 00:22:47 +0000 (00:22 +0000)
* lib/utimens.c (fdutimens) [HAVE_FUTIMENS]: Call futimens only
when we have a valid file descriptor.  Otherwise, using a brand
new glibc (with just-patched futimens that now fails with EBADF)
would cause this function to fail with ENOSYS.
Reported by Guillaume Ayoub in http://bugs.debian.org/563726.
See also http://bugzilla.redhat.com/552320.

Signed-off-by: Eric Blake <ebb9@byu.net>
(cherry picked from commit 41c44a66101c6c14b4e7f151247d517579760ba9)

ChangeLog
lib/utimens.c

index 833c872..f7218e3 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2010-01-05  Aurelien Jarno  <aurelien@aurel32.net>  (tiny change)
+
+       utimens (fdutimens): ignore a negative FD, per contract
+       * lib/utimens.c (fdutimens) [HAVE_FUTIMENS]: Call futimens only
+       when we have a valid file descriptor.  Otherwise, using a brand
+       new glibc (with just-patched futimens that now fails with EBADF)
+       would cause this function to fail with ENOSYS.
+       Reported by Guillaume Ayoub in http://bugs.debian.org/563726.
+       See also http://bugzilla.redhat.com/552320.
+
 2010-01-05  Eric Blake  <ebb9@byu.net>
 
        strcase: document what it provides
index 4df1646..bdb5a25 100644 (file)
@@ -264,19 +264,20 @@ fdutimens (char const *file, int fd, struct timespec const timespec[2])
         }
 # endif /* HAVE_UTIMENSAT */
 # if HAVE_FUTIMENS
-      {
-        result = futimens (fd, ts);
+      if (0 <= fd)
+        {
+          result = futimens (fd, ts);
 #  ifdef __linux__
-        /* Work around the same bug as above.  */
-        if (0 < result)
-          errno = ENOSYS;
+          /* Work around the same bug as above.  */
+          if (0 < result)
+            errno = ENOSYS;
 #  endif /* __linux__ */
-        if (result == 0 || errno != ENOSYS)
-          {
-            utimensat_works_really = 1;
-            return result;
-          }
-      }
+          if (result == 0 || errno != ENOSYS)
+            {
+              utimensat_works_really = 1;
+              return result;
+            }
+        }
 # endif /* HAVE_FUTIMENS */
     }
   utimensat_works_really = -1;