From 1fb62d581554435800ba339e7f7912cd81d619ba Mon Sep 17 00:00:00 2001 From: Dmitry Vyukov Date: Thu, 9 Aug 2018 16:03:06 +0200 Subject: [PATCH] executor: fix FS_XFLAG_IMMUTABLE for 32-bit mode FS_IOC_FSSETXATTR is not supported in compat mode, use FS_IOC_SETFLAGS instead. --- executor/common_linux.h | 20 +++++--------------- pkg/csource/generated.go | 18 +++++------------- 2 files changed, 10 insertions(+), 28 deletions(-) diff --git a/executor/common_linux.h b/executor/common_linux.h index e491c1f9..b5963327 100644 --- a/executor/common_linux.h +++ b/executor/common_linux.h @@ -1741,17 +1741,7 @@ static int do_sandbox_namespace(void) #include #include -// This should be in 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; diff --git a/pkg/csource/generated.go b/pkg/csource/generated.go index a5b25001..595a8709 100644 --- a/pkg/csource/generated.go +++ b/pkg/csource/generated.go @@ -3218,16 +3218,8 @@ static int do_sandbox_namespace(void) #include #include #include -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) static void remove_dir(const char* dir) { DIR* dp; @@ -3267,8 +3259,8 @@ retry: if (errno == EPERM) { 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; @@ -3295,8 +3287,8 @@ retry: if (errno == EPERM) { 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;