From d23dbe914d68c21f67e2fd75243ae72314295e62 Mon Sep 17 00:00:00 2001 From: cptpcrd <31829097+cptpcrd@users.noreply.github.com> Date: Tue, 13 Apr 2021 20:52:11 -0400 Subject: [PATCH] main: tv_sec -> tv_nsec As specified in utimensat(2), *tv_nsec*, not *tv_sec*, should be set to UTIME_NOW or UTIME_OMIT. The way this bug manifests is that if utimensat() is called with one of the timestamps set to UTIME_OMIT, fuse-overlayfs will accidentally reset the timestamp to 1073741822, which is 2004-01-10 13:37:02 UTC. --- main.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/main.c b/main.c index 14ac260..6936894 100644 --- a/main.c +++ b/main.c @@ -3947,19 +3947,19 @@ ovl_setattr (fuse_req_t req, fuse_ino_t ino, struct stat *attr, int to_set, stru l = release_big_lock (); memset (times, 0, sizeof (times)); - times[0].tv_sec = UTIME_OMIT; - times[1].tv_sec = UTIME_OMIT; + times[0].tv_nsec = UTIME_OMIT; + times[1].tv_nsec = UTIME_OMIT; if (to_set & FUSE_SET_ATTR_ATIME) times[0] = attr->st_atim; else if (to_set & FUSE_SET_ATTR_ATIME_NOW) - times[0].tv_sec = UTIME_NOW; + times[0].tv_nsec = UTIME_NOW; if (to_set & FUSE_SET_ATTR_MTIME) times[1] = attr->st_mtim; else if (to_set & FUSE_SET_ATTR_MTIME_NOW) - times[1].tv_sec = UTIME_NOW; + times[1].tv_nsec = UTIME_NOW; - if (times[0].tv_sec != UTIME_OMIT || times[1].tv_sec != UTIME_OMIT) + if (times[0].tv_nsec != UTIME_OMIT || times[1].tv_nsec != UTIME_OMIT) { if (fd >= 0) ret = futimens (fd, times);