From e9f5f04883f713dc08f24bf1ea5af743d7cf661e Mon Sep 17 00:00:00 2001 From: Giuseppe Scrivano Date: Wed, 12 Jun 2019 12:13:58 +0200 Subject: [PATCH] rm: fix regression when deleting a file fix a regression caused by 7dcef0769b1521b8f14bdee58339c26140466c85 Closes: https://bodhi.fedoraproject.org/updates/FEDORA-2019-fff1ded16e#comment-958825 Signed-off-by: Giuseppe Scrivano --- .travis.yml | 1 + main.c | 19 +++++++++++++++++-- tests/fedora-installs.sh | 13 +++++++++---- 3 files changed, 27 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index b9d02ff..80dec58 100644 --- a/.travis.yml +++ b/.travis.yml @@ -40,6 +40,7 @@ script: - (cd /unionmount-testsuite; sudo unshare -m ./run --ov --fuse=fuse-overlayfs --xdev) || travis_terminate 1; - (cd /unionmount-testsuite; sudo FUSE_OVERLAYFS_DISABLE_OVL_WHITEOUT=1 unshare -m ./run --ov --fuse=fuse-overlayfs --xdev) || travis_terminate 1; - sudo tests/fedora-installs.sh || travis_terminate 1; + - sudo tests/fedora-rm.sh || travis_terminate 1; - sudo tests/unlink.sh || travis_terminate 1; - (cd $GOPATH/src/github.com/containers/storage/tests; sudo STORAGE_OPTION=overlay.mount_program=/sbin/fuse-overlayfs STORAGE_DRIVER=overlay unshare -m ./test_runner.bash) || travis_terminate 1; - (cd $GOPATH/src/github.com/containers/storage/tests; sudo FUSE_OVERLAYFS_DISABLE_OVL_WHITEOUT=1 STORAGE_OPTION=overlay.mount_program=/sbin/fuse-overlayfs STORAGE_DRIVER=overlay unshare -m ./test_runner.bash) || travis_terminate 1; diff --git a/main.c b/main.c index af972aa..4f36694 100644 --- a/main.c +++ b/main.c @@ -637,11 +637,26 @@ hide_node (struct ovl_data *lo, struct ovl_node *node, bool unlink_src) { if (node->parent) { - if (create_whiteout (lo, node->parent, node->name, false, false) < 0) + /* If we are here, it means we have no permissions to use mknod. Also + since the file is not yet moved, creating a whiteout would fail on + the mknodat call. */ + if (create_whiteout (lo, node->parent, node->name, true, false) < 0) return -1; } if (renameat (upper_layer_fd (lo), node->path, lo->workdir_fd, newpath) < 0) - return -1; + { + if (node->parent) + { + cleanup_free char *whpath = NULL; + + ret = asprintf (&whpath, "%s/.wh.%s", node->parent->path, node->name); + /* If the rename failed, then try to delete the whiteout file we + created earlier. */ + if (ret == 0) + unlinkat (upper_layer_fd (lo), whpath, 0); + } + return -1; + } } } else diff --git a/tests/fedora-installs.sh b/tests/fedora-installs.sh index c73ab8c..50dd9ca 100755 --- a/tests/fedora-installs.sh +++ b/tests/fedora-installs.sh @@ -1,10 +1,12 @@ -#!/bin/sh +#!/bin/bash + +set -xeuo pipefail mkdir lower upper workdir merged fuse-overlayfs -o lowerdir=lower,upperdir=upper,workdir=workdir,suid,dev merged -docker run --rm -ti -v merged:/merged fedora dnf --installroot /merged --releasever 29 install -y glibc-common gedit +docker run --rm -ti -v merged:/merged fedora dnf --installroot /merged --releasever 30 install -y glibc-common gedit umount merged @@ -16,8 +18,11 @@ mkdir upper workdir fuse-overlayfs -o lowerdir=lower,upperdir=upper,workdir=workdir,suid,dev merged # Install some big packages -docker run --rm -ti -v merged:/merged fedora dnf --installroot /merged --releasever 29 install -y emacs texlive +docker run --rm -ti -v merged:/merged fedora dnf --installroot /merged --releasever 30 install -y emacs texlive -docker run --rm -ti -v merged:/merged fedora sh -c 'rm /usr/share/glib-2.0/schemas/gschemas.compiled; glib-compile-schemas /usr/share/glib-2.0/schemas/' +docker run --rm -ti -v merged:/merged fedora sh -c 'rm /merged/usr/share/glib-2.0/schemas/gschemas.compiled; glib-compile-schemas /merged/usr/share/glib-2.0/schemas/' umount merged +fuse-overlayfs -o lowerdir=lower,upperdir=upper,workdir=workdir,suid,dev merged + +docker run --rm -ti -v merged:/merged fedora sh -c 'rm -rf /merged/usr/share/glib-2.0/'