diff --git a/tools/testing/selftests/filesystems/fuse/fusectl_test.c b/tools/testing/selftests/filesystems/fuse/fusectl_test.c index 7050fbe0970e..8d124d1cacb2 100644 --- a/tools/testing/selftests/filesystems/fuse/fusectl_test.c +++ b/tools/testing/selftests/filesystems/fuse/fusectl_test.c @@ -14,6 +14,7 @@ #include #include #include +#include #include #include "../../kselftest_harness.h" @@ -23,6 +24,17 @@ #define FUSE_DEVICE "/dev/fuse" #define FUSECTL_TEST_VALUE "1" +static void write_file(struct __test_metadata *const _metadata, + const char *path, const char *val) +{ + int fd = open(path, O_WRONLY); + size_t len = strlen(val); + + ASSERT_GE(fd, 0); + ASSERT_EQ(write(fd, val, len), len); + ASSERT_EQ(close(fd), 0); +} + FIXTURE(fusectl){ char fuse_mountpoint[sizeof(FUSE_MOUNTPOINT)]; int connection; @@ -33,6 +45,18 @@ FIXTURE_SETUP(fusectl) const char *fuse_mnt_prog = "./fuse_mnt"; int status, pid; struct stat statbuf; + uid_t uid = getuid(); + gid_t gid = getgid(); + char buf[32]; + + /* Setup userns */ + ASSERT_EQ(unshare(CLONE_NEWNS|CLONE_NEWUSER), 0); + sprintf(buf, "0 %d 1", uid); + write_file(_metadata, "/proc/self/uid_map", buf); + write_file(_metadata, "/proc/self/setgroups", "deny"); + sprintf(buf, "0 %d 1", gid); + write_file(_metadata, "/proc/self/gid_map", buf); + ASSERT_EQ(mount("", "/", NULL, MS_REC|MS_PRIVATE, NULL), 0); strcpy(self->fuse_mountpoint, FUSE_MOUNTPOINT); @@ -73,7 +97,7 @@ FIXTURE_SETUP(fusectl) FIXTURE_TEARDOWN(fusectl) { - umount(self->fuse_mountpoint); + umount2(self->fuse_mountpoint, MNT_DETACH); rmdir(self->fuse_mountpoint); }