The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/lxc/pull/3322

This e-mail was sent by the LXC bot, direct replies will not reach the author
unless they happen to be subscribed to this list.

=== Description (from pull-request) ===
Closes #3185.
Signed-off-by: Christian Brauner <christian.brau...@ubuntu.com>
From 066210f0b9044a190784d3c4c553539b8013b24e Mon Sep 17 00:00:00 2001
From: Christian Brauner <christian.brau...@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.brau...@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;
+                               }
                        }
                }
        }
_______________________________________________
lxc-devel mailing list
lxc-devel@lists.linuxcontainers.org
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to