diff mbox series

[mickledore,05/13] unfs3: fix symlink time setting issue

Message ID 221b509b31a44a16ccc0f66293e51b86322c0b5b.1684291329.git.steve@sakoman.com
State New
Headers show
Series [mickledore,01/13] ghostscript: fix CVE-2023-28879 | expand

Commit Message

Steve Sakoman May 17, 2023, 2:44 a.m. UTC
From: hen Qi <Qi.Chen@windriver.com>

Add back the dropped 0001-attr-fix-utime-for-symlink.patch
to fix symlink time setting issue on NFS.

The problem could be reproduced by runing the following command
on nfs booted qemu:

  ln -s dest src && touch -h src

Apart from the rpm operations mentioned in the original patch,
'docker pull' also fails with a 'stale file' error. The common
pattern here is extracting files from a bundle and setting times
for them.

Signed-off-by: Chen Qi <Qi.Chen@windriver.com>
Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
(cherry picked from commit fe35a2c11ba6f87735bccae244817016f9c1b5db)
Signed-off-by: Steve Sakoman <steve@sakoman.com>
---
 .../0001-attr-fix-utime-for-symlink.patch     | 88 +++++++++++++++++++
 meta/recipes-devtools/unfs3/unfs3_git.bb      |  1 +
 2 files changed, 89 insertions(+)
 create mode 100644 meta/recipes-devtools/unfs3/unfs3/0001-attr-fix-utime-for-symlink.patch
diff mbox series

Patch

diff --git a/meta/recipes-devtools/unfs3/unfs3/0001-attr-fix-utime-for-symlink.patch b/meta/recipes-devtools/unfs3/unfs3/0001-attr-fix-utime-for-symlink.patch
new file mode 100644
index 0000000000..a0f3740d6a
--- /dev/null
+++ b/meta/recipes-devtools/unfs3/unfs3/0001-attr-fix-utime-for-symlink.patch
@@ -0,0 +1,88 @@ 
+From 7e789895919d57d573ebb8faa147d1286104cd01 Mon Sep 17 00:00:00 2001
+From: Rui Wang <rui.wang@windriver.com>
+Date: Mon, 24 Apr 2023 02:57:57 -0700
+Subject: [PATCH] attr: fix utime for symlink
+
+unfs3 has an old defect that it can not change the timestamps of a
+symlink file because it only uses utime(), which will follow the
+symlink. This will not cause an error if the symlink points to an
+existent file. But under some special situation, such as installing
+a rpm package, rpm tool will create the symlink first and try to
+modify the timestamps of it, when the target file is non-existent.
+This will cause an ESTALE error. Making rpm tool ignore this error
+is a solution, but not the best one. An acceptable approach is
+Making unfs3 support lutimes(), which can modify the symlink file
+itself. Considering not every system support this function, so a
+function checking is necessary.
+
+Upstream-Status: Submitted [https://github.com/unfs3/unfs3/pull/35]
+
+Signed-off-by: Chen Qi <Qi.Chen@windriver.com>
+---
+ attr.c         | 15 +++++++++++----
+ backend_unix.h |  2 ++
+ configure.ac   |  1 +
+ 3 files changed, 14 insertions(+), 4 deletions(-)
+
+diff --git a/attr.c b/attr.c
+index 0ce9375..930ce6e 100644
+--- a/attr.c
++++ b/attr.c
+@@ -285,7 +285,7 @@ post_op_attr get_post_cached(struct svc_req * req)
+ static nfsstat3 set_time(const char *path, backend_statstruct buf, sattr3 new)
+ {
+     time_t new_atime, new_mtime;
+-    struct utimbuf utim;
++    struct timeval stamps[2];
+     int res;
+ 
+     /* set atime and mtime */
+@@ -307,10 +307,17 @@ static nfsstat3 set_time(const char *path, backend_statstruct buf, sattr3 new)
+ 	else			       /* DONT_CHANGE */
+ 	    new_mtime = buf.st_mtime;
+ 
+-	utim.actime = new_atime;
+-	utim.modtime = new_mtime;
++	stamps[0].tv_sec = new_atime;
++	stamps[0].tv_usec = 0;
++	stamps[1].tv_sec = new_mtime;
++	stamps[1].tv_usec = 0;
++
++#if HAVE_LUTIMES
++	res = backend_lutimes(path, stamps);
++#else
++	res = backend_utimes(path, stamps);
++#endif
+ 
+-	res = backend_utime(path, &utim);
+ 	if (res == -1)
+ 	    return setattr_err();
+     }
+diff --git a/backend_unix.h b/backend_unix.h
+index 4db72ae..9cce9ab 100644
+--- a/backend_unix.h
++++ b/backend_unix.h
+@@ -61,6 +61,8 @@
+ #define backend_symlink symlink
+ #define backend_truncate truncate
+ #define backend_utime utime
++#define backend_utimes utimes
++#define backend_lutimes lutimes
+ #define backend_statstruct struct stat
+ #define backend_dirstream DIR
+ #define backend_statvfsstruct struct statvfs
+diff --git a/configure.ac b/configure.ac
+index d46c905..c21afe3 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -32,6 +32,7 @@ AC_CHECK_FUNCS(setresuid setresgid)
+ AC_CHECK_FUNCS(vsyslog)
+ AC_CHECK_FUNCS(lchown)
+ AC_CHECK_FUNCS(setgroups)
++AC_CHECK_FUNCS(lutimes)
+ UNFS3_COMPILE_WARNINGS
+ 
+ PKG_CHECK_MODULES([TIRPC], [libtirpc])
+-- 
+2.40.0
+
diff --git a/meta/recipes-devtools/unfs3/unfs3_git.bb b/meta/recipes-devtools/unfs3/unfs3_git.bb
index 9913a503e8..c5b7898b3c 100644
--- a/meta/recipes-devtools/unfs3/unfs3_git.bb
+++ b/meta/recipes-devtools/unfs3/unfs3_git.bb
@@ -17,6 +17,7 @@  SRC_URI = "git://github.com/unfs3/unfs3.git;protocol=https;branch=master \
            file://0001-Alias-off64_t-to-off_t-on-linux-if-not-defined.patch \
            file://0001-locate.c-Include-attr.h.patch \
            file://0001-fix-building-on-macOS.patch \
+           file://0001-attr-fix-utime-for-symlink.patch \
            "
 SRCREV = "c8f2d2cd4529955419bad0e163f88d47ff176b8d"
 UPSTREAM_CHECK_GITTAGREGEX = "unfs3\-(?P<pver>\d+(\.\d+)+)"