From 41c44a66101c6c14b4e7f151247d517579760ba9 Mon Sep 17 00:00:00 2001 From: Aurelien Jarno Date: Tue, 5 Jan 2010 20:27:12 -0700 Subject: [PATCH] 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. Signed-off-by: Eric Blake --- ChangeLog | 10 ++++++++++ lib/utimens.c | 23 ++++++++++++----------- 2 files changed, 22 insertions(+), 11 deletions(-) diff --git a/ChangeLog b/ChangeLog index 833c872d9..f7218e337 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2010-01-05 Aurelien Jarno (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 strcase: document what it provides diff --git a/lib/utimens.c b/lib/utimens.c index 4df1646d7..bdb5a25ae 100644 --- a/lib/utimens.c +++ b/lib/utimens.c @@ -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; -- 2.11.0