From dcfadc012ee219c3aa37c4eb238306781d604a4f Mon Sep 17 00:00:00 2001 From: Giuseppe Scrivano Date: Tue, 1 Feb 2022 09:25:59 +0100 Subject: [PATCH 1/4] tests: use centos:stream8 Signed-off-by: Giuseppe Scrivano --- tests/fedora-installs.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/fedora-installs.sh b/tests/fedora-installs.sh index 7f63480..b215a80 100755 --- a/tests/fedora-installs.sh +++ b/tests/fedora-installs.sh @@ -48,14 +48,14 @@ mkdir upper workdir lower fuse-overlayfs -o sync=0,lowerdir=lower,upperdir=upper,workdir=workdir,suid,dev merged # https://github.com/containers/fuse-overlayfs/issues/86 -docker run --rm -v $(pwd)/merged:/merged centos:8 yum --installroot /merged -y --releasever 8 install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm +docker run --rm -v $(pwd)/merged:/merged quay.io/centos/centos:stream8 yum --installroot /merged -y --releasever 8 install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm umount merged # fast_ino_check fuse-overlayfs -o fast_ino_check=1,sync=0,lowerdir=lower,upperdir=upper,workdir=workdir,suid,dev merged -docker run --rm -v $(pwd)/merged:/merged centos:8 yum --installroot /merged -y --releasever 8 install nano +docker run --rm -v $(pwd)/merged:/merged quay.io/centos/centos:stream8 yum --installroot /merged -y --releasever 8 install nano mkdir merged/a-directory From 592e50e271036068aad61144804d40d83b1bae66 Mon Sep 17 00:00:00 2001 From: Giuseppe Scrivano Date: Mon, 31 Jan 2022 16:08:35 +0100 Subject: [PATCH 2/4] main: fix lookup if underlying file is a symlink fix lookup if the underlying file is a symlink, while it is a directory on the upper layer. Closes: https://github.com/containers/fuse-overlayfs/issues/337 Signed-off-by: Giuseppe Scrivano --- main.c | 21 +++++++++++++++++++-- tests/fedora-installs.sh | 14 +++++++++++++- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/main.c b/main.c index e2bd46f..38aed0d 100644 --- a/main.c +++ b/main.c @@ -1485,6 +1485,9 @@ make_ovl_node (struct ovl_data *lo, const char *path, struct ovl_layer *layer, c int r; r = it->ds->file_exists (it, whiteout_path); + if (r < 0 && errno == EACCES) + break; + if (r < 0 && errno != ENOENT && errno != ENOTDIR && errno != ENAMETOOLONG) return NULL; @@ -1659,8 +1662,9 @@ load_dir (struct ovl_data *lo, struct ovl_node *n, struct ovl_layer *layer, char for (it = lo->layers; it && !stop_lookup; it = it->next) { - int ret; + struct stat st; DIR *dp = NULL; + int ret; if (n->last_layer == it) stop_lookup = true; @@ -1672,6 +1676,17 @@ load_dir (struct ovl_data *lo, struct ovl_node *n, struct ovl_layer *layer, char if (ret == 0) break; + ret = it->ds->statat (it, path, &st, AT_SYMLINK_NOFOLLOW, STATX_TYPE); + if (ret < 0) + { + if (errno == ENOENT || errno == ENOTDIR || errno == ENAMETOOLONG) + continue; + return NULL; + } + /* not a directory, stop lookup in lower layers. */ + if ((st.st_mode & S_IFMT) != S_IFDIR) + break; + dp = it->ds->opendir (it, path); if (dp == NULL) continue; @@ -1720,6 +1735,8 @@ load_dir (struct ovl_data *lo, struct ovl_node *n, struct ovl_layer *layer, char strconcat3 (node_path, PATH_MAX, n->path, "/", dent->d_name); ret = it->ds->file_exists (it, whiteout_path); + if (ret < 0 && errno == EACCES) + continue; if (ret < 0 && errno != ENOENT && errno != ENOTDIR && errno != ENAMETOOLONG) { it->ds->closedir (dp); @@ -2020,7 +2037,7 @@ do_lookup_file (struct ovl_data *lo, fuse_ino_t parent, const char *name) { int saved_errno = errno; - if (errno == ENOENT || errno == ENOTDIR) + if (errno == ENOENT || errno == ENOTDIR || errno == EACCES) { if (node) continue; diff --git a/tests/fedora-installs.sh b/tests/fedora-installs.sh index b215a80..c59d9b3 100755 --- a/tests/fedora-installs.sh +++ b/tests/fedora-installs.sh @@ -251,5 +251,17 @@ test \! -e upper/a/b mknod merged/dev-foo c 10 175 attr -l merged/dev-foo -umount merged +# https://github.com/containers/fuse-overlayfs/issues/337 +umount -l merged +rm -rf lower upper workdir merged +mkdir lower upper workdir merged + +mkdir upper/foo +ln -s not/existing lower/foo + +fuse-overlayfs -o lowerdir=lower,upperdir=upper,workdir=workdir merged + +stat merged/foo + +umount merged From d01bdd73b6bd1ffccaa163ef3e2660e1838305cb Mon Sep 17 00:00:00 2001 From: Giuseppe Scrivano Date: Mon, 31 Jan 2022 16:09:58 +0100 Subject: [PATCH 3/4] NEWS: tag 1.8.2 Signed-off-by: Giuseppe Scrivano --- NEWS | 5 +++++ configure.ac | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index a9776b5..934ae3f 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,8 @@ +* fuse-overlayfs-1.8.2 + +- main: fix lookup if underlying path is a symlink, but a directory on + a upper directory. + * fuse-overlayfs-1.8.1 - main: fix race when looking up an inode that was renamed. diff --git a/configure.ac b/configure.ac index 993d52d..326e2b1 100644 --- a/configure.ac +++ b/configure.ac @@ -1,5 +1,5 @@ AC_PREREQ([2.69]) -AC_INIT([fuse-overlayfs], [1.9-dev], [giuseppe@scrivano.org]) +AC_INIT([fuse-overlayfs], [1.8.2], [giuseppe@scrivano.org]) AC_CONFIG_SRCDIR([main.c]) AC_CONFIG_HEADERS([config.h]) From dc02ca1a818b0864728d036e2cbcb2ae76e74d59 Mon Sep 17 00:00:00 2001 From: Giuseppe Scrivano Date: Mon, 31 Jan 2022 16:10:11 +0100 Subject: [PATCH 4/4] configure.ac: back to dev Signed-off-by: Giuseppe Scrivano --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 326e2b1..993d52d 100644 --- a/configure.ac +++ b/configure.ac @@ -1,5 +1,5 @@ AC_PREREQ([2.69]) -AC_INIT([fuse-overlayfs], [1.8.2], [giuseppe@scrivano.org]) +AC_INIT([fuse-overlayfs], [1.9-dev], [giuseppe@scrivano.org]) AC_CONFIG_SRCDIR([main.c]) AC_CONFIG_HEADERS([config.h])