[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