mirror of
https://github.com/containers/fuse-overlayfs.git
synced 2025-08-04 02:15:58 -04:00
Merge pull request #338 from giuseppe/fix-lookup-symlink-lower
main: fix lookup if underlying file is a symlink
This commit is contained in:
commit
dab543801d
5
NEWS
5
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
|
* fuse-overlayfs-1.8.1
|
||||||
|
|
||||||
- main: fix race when looking up an inode that was renamed.
|
- main: fix race when looking up an inode that was renamed.
|
||||||
|
21
main.c
21
main.c
@ -1485,6 +1485,9 @@ make_ovl_node (struct ovl_data *lo, const char *path, struct ovl_layer *layer, c
|
|||||||
int r;
|
int r;
|
||||||
|
|
||||||
r = it->ds->file_exists (it, whiteout_path);
|
r = it->ds->file_exists (it, whiteout_path);
|
||||||
|
if (r < 0 && errno == EACCES)
|
||||||
|
break;
|
||||||
|
|
||||||
if (r < 0 && errno != ENOENT && errno != ENOTDIR && errno != ENAMETOOLONG)
|
if (r < 0 && errno != ENOENT && errno != ENOTDIR && errno != ENAMETOOLONG)
|
||||||
return NULL;
|
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)
|
for (it = lo->layers; it && !stop_lookup; it = it->next)
|
||||||
{
|
{
|
||||||
int ret;
|
struct stat st;
|
||||||
DIR *dp = NULL;
|
DIR *dp = NULL;
|
||||||
|
int ret;
|
||||||
|
|
||||||
if (n->last_layer == it)
|
if (n->last_layer == it)
|
||||||
stop_lookup = true;
|
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)
|
if (ret == 0)
|
||||||
break;
|
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);
|
dp = it->ds->opendir (it, path);
|
||||||
if (dp == NULL)
|
if (dp == NULL)
|
||||||
continue;
|
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);
|
strconcat3 (node_path, PATH_MAX, n->path, "/", dent->d_name);
|
||||||
|
|
||||||
ret = it->ds->file_exists (it, whiteout_path);
|
ret = it->ds->file_exists (it, whiteout_path);
|
||||||
|
if (ret < 0 && errno == EACCES)
|
||||||
|
continue;
|
||||||
if (ret < 0 && errno != ENOENT && errno != ENOTDIR && errno != ENAMETOOLONG)
|
if (ret < 0 && errno != ENOENT && errno != ENOTDIR && errno != ENAMETOOLONG)
|
||||||
{
|
{
|
||||||
it->ds->closedir (dp);
|
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;
|
int saved_errno = errno;
|
||||||
|
|
||||||
if (errno == ENOENT || errno == ENOTDIR)
|
if (errno == ENOENT || errno == ENOTDIR || errno == EACCES)
|
||||||
{
|
{
|
||||||
if (node)
|
if (node)
|
||||||
continue;
|
continue;
|
||||||
|
@ -48,14 +48,14 @@ mkdir upper workdir lower
|
|||||||
fuse-overlayfs -o sync=0,lowerdir=lower,upperdir=upper,workdir=workdir,suid,dev merged
|
fuse-overlayfs -o sync=0,lowerdir=lower,upperdir=upper,workdir=workdir,suid,dev merged
|
||||||
|
|
||||||
# https://github.com/containers/fuse-overlayfs/issues/86
|
# 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
|
umount merged
|
||||||
|
|
||||||
# fast_ino_check
|
# fast_ino_check
|
||||||
fuse-overlayfs -o fast_ino_check=1,sync=0,lowerdir=lower,upperdir=upper,workdir=workdir,suid,dev merged
|
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
|
mkdir merged/a-directory
|
||||||
|
|
||||||
@ -251,5 +251,17 @@ test \! -e upper/a/b
|
|||||||
mknod merged/dev-foo c 10 175
|
mknod merged/dev-foo c 10 175
|
||||||
attr -l merged/dev-foo
|
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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user