[lxc-devel] [lxc/master] utils: allow removal of immutable files
brauner on Github
lxc-bot at linuxcontainers.org
Mon Mar 23 15:07:27 UTC 2020
A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 379 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20200323/4c6f1a26/attachment.bin>
-------------- next part --------------
From 066210f0b9044a190784d3c4c553539b8013b24e Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brauner at ubuntu.com>
Date: Mon, 23 Mar 2020 16:06:40 +0100
Subject: [PATCH] utils: allow removal of immutable files
Closes #3185.
Signed-off-by: Christian Brauner <christian.brauner at ubuntu.com>
---
src/lxc/utils.c | 27 ++++++++++++++++++++++++---
1 file changed, 24 insertions(+), 3 deletions(-)
diff --git a/src/lxc/utils.c b/src/lxc/utils.c
index 25ae794b0d..c34519084d 100644
--- a/src/lxc/utils.c
+++ b/src/lxc/utils.c
@@ -19,6 +19,8 @@
#include <string.h>
#include <sys/mman.h>
#include <sys/mount.h>
+/* Needs to be after sys/mount.h header */
+#include <linux/fs.h>
#include <sys/param.h>
#include <sys/prctl.h>
#include <sys/stat.h>
@@ -129,9 +131,28 @@ static int _recursive_rmdir(const char *dirname, dev_t pdev,
if (_recursive_rmdir(pathname, pdev, exclude, level + 1, onedev) < 0)
failed = 1;
} else {
- if (unlink(pathname) < 0) {
- SYSERROR("Failed to delete \"%s\"", pathname);
- failed = 1;
+ ret = unlink(pathname);
+ if (ret < 0) {
+ __do_close int fd = -EBADF;
+
+ fd = open(pathname, O_RDONLY | O_CLOEXEC | O_NONBLOCK);
+ if (fd >= 0) {
+ /* The file might be marked immutable. */
+ int attr = 0;
+ ret = ioctl(fd, FS_IOC_GETFLAGS, &attr);
+ if (ret < 0)
+ SYSERROR("Failed to retrieve file flags");
+ attr &= ~FS_IMMUTABLE_FL;
+ ret = ioctl(fd, FS_IOC_SETFLAGS, &attr);
+ if (ret < 0)
+ SYSERROR("Failed to set file flags");
+ }
+
+ ret = unlink(pathname);
+ if (ret < 0) {
+ SYSERROR("Failed to delete \"%s\"", pathname);
+ failed = 1;
+ }
}
}
}
More information about the lxc-devel
mailing list