Unverified Commit e4e80aa9 by Stéphane Graber Committed by GitHub

Merge pull request #3322 from brauner/2020-03-24/fixes

utils: allow removal of immutable files
parents 99a1811c 066210f0
...@@ -19,6 +19,8 @@ ...@@ -19,6 +19,8 @@
#include <string.h> #include <string.h>
#include <sys/mman.h> #include <sys/mman.h>
#include <sys/mount.h> #include <sys/mount.h>
/* Needs to be after sys/mount.h header */
#include <linux/fs.h>
#include <sys/param.h> #include <sys/param.h>
#include <sys/prctl.h> #include <sys/prctl.h>
#include <sys/stat.h> #include <sys/stat.h>
...@@ -129,9 +131,28 @@ static int _recursive_rmdir(const char *dirname, dev_t pdev, ...@@ -129,9 +131,28 @@ static int _recursive_rmdir(const char *dirname, dev_t pdev,
if (_recursive_rmdir(pathname, pdev, exclude, level + 1, onedev) < 0) if (_recursive_rmdir(pathname, pdev, exclude, level + 1, onedev) < 0)
failed = 1; failed = 1;
} else { } else {
if (unlink(pathname) < 0) { ret = unlink(pathname);
SYSERROR("Failed to delete \"%s\"", pathname); if (ret < 0) {
failed = 1; __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;
}
} }
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment