fuse-overlayfs: fix renameat2(RENAME_NOREPLACE)

when device whiteouts are created (supported for unprivileged users in
newer Linux kernels) make sure the RENAME_NOREPLACE flag is dropped
when renaming the file on top of an existing whiteout.

Closes: https://github.com/containers/fuse-overlayfs/issues/273

Signed-off-by: Giuseppe Scrivano <gscrivan@redhat.com>
This commit is contained in:
Giuseppe Scrivano 2021-02-01 23:00:47 +01:00
parent b104426786
commit 450b0d790f
No known key found for this signature in database
GPG Key ID: E4730F97F60286ED
2 changed files with 8 additions and 1 deletions

4
main.c
View File

@ -757,7 +757,6 @@ create_whiteout (struct ovl_data *lo, struct ovl_node *parent, const char *name,
strconcat3 (whiteout_wh_path, PATH_MAX, parent->path, "/.wh.", name);
fd = get_upper_layer (lo)->ds->openat (get_upper_layer (lo), whiteout_wh_path, O_CREAT|O_WRONLY|O_NONBLOCK, 0700);
if (fd < 0 && errno != EEXIST)
return -1;
@ -4532,6 +4531,9 @@ ovl_rename_direct (fuse_req_t req, fuse_ino_t parent, const char *name,
rename+mknod separately. */
ret = direct_renameat2 (srcfd, name, destfd,
newname, flags|RENAME_WHITEOUT);
/* If the destination is a whiteout, just overwrite it. */
if (ret < 0 && errno == EEXIST)
ret = direct_renameat2 (srcfd, name, destfd, newname, flags & ~RENAME_NOREPLACE);
if (ret < 0)
{
ret = direct_renameat2 (srcfd, name, destfd,

View File

@ -206,3 +206,8 @@ sleep 30 < merged/toremove &
sleep_pid=$!
rm merged/toremove
grep 12345 /proc/$sleep_pid/fd/0
RUN touch merged/a merged/b
RUN chmod 6 merged/a
RUN mv merged/a merged/x
RUN mv merged/b merged/a