aboutsummaryrefslogtreecommitdiffstats
path: root/executor/common_linux.h
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2018-08-09 16:03:06 +0200
committerDmitry Vyukov <dvyukov@google.com>2018-08-09 16:05:46 +0200
commit1fb62d581554435800ba339e7f7912cd81d619ba (patch)
treec36ae07b01819a4eb8b66a774c2a365b6d5cef9a /executor/common_linux.h
parentfa9be141644138bad55f9425fc2ac0b9e8baa0f0 (diff)
executor: fix FS_XFLAG_IMMUTABLE for 32-bit mode
FS_IOC_FSSETXATTR is not supported in compat mode, use FS_IOC_SETFLAGS instead.
Diffstat (limited to 'executor/common_linux.h')
-rw-r--r--executor/common_linux.h20
1 files changed, 5 insertions, 15 deletions
diff --git a/executor/common_linux.h b/executor/common_linux.h
index e491c1f94..b59633273 100644
--- a/executor/common_linux.h
+++ b/executor/common_linux.h
@@ -1741,17 +1741,7 @@ static int do_sandbox_namespace(void)
#include <sys/ioctl.h>
#include <sys/mount.h>
-// This should be in <linux/fs.h> but is not there on some distros/arches as expected.
-struct fsxattr {
- uint32 fsx_xflags;
- uint32 fsx_extsize;
- uint32 fsx_nextents;
- uint32 fsx_projid;
- uint32 fsx_cowextsize;
- char fsx_pad[8];
-};
-
-#define FS_IOC_FSSETXATTR _IOW('X', 32, struct fsxattr)
+#define FS_IOC_SETFLAGS _IOW('f', 2, long)
// One does not simply remove a directory.
// There can be mounts, so we need to try to umount.
@@ -1803,8 +1793,8 @@ retry:
// Try to reset FS_XFLAG_IMMUTABLE.
int fd = open(filename, O_RDONLY);
if (fd != -1) {
- struct fsxattr attr = {0};
- if (ioctl(fd, FS_IOC_FSSETXATTR, &attr) == 0)
+ long flags = 0;
+ if (ioctl(fd, FS_IOC_SETFLAGS, &flags) == 0)
debug("reset FS_XFLAG_IMMUTABLE\n");
close(fd);
continue;
@@ -1832,8 +1822,8 @@ retry:
// Try to reset FS_XFLAG_IMMUTABLE.
int fd = open(dir, O_RDONLY);
if (fd != -1) {
- struct fsxattr attr = {0};
- if (ioctl(fd, FS_IOC_FSSETXATTR, &attr) == 0)
+ long flags = 0;
+ if (ioctl(fd, FS_IOC_SETFLAGS, &flags) == 0)
debug("reset FS_XFLAG_IMMUTABLE\n");
close(fd);
continue;