From: Christian Brauner Date: Thu, 12 Dec 2024 23:03:46 +0000 (+0100) Subject: seltests: move nsfs into filesystems subfolder X-Git-Tag: io_uring-6.14-20240131~35^2~6^2~3 X-Git-Url: https://git.kernel.dk/?a=commitdiff_plain;h=cae73d3bdce5dc6cdbf454fcc37a6fb2f025151e;p=linux-block.git seltests: move nsfs into filesystems subfolder I'm going to be adding new tests for it and it belongs under filesystem selftests. Link: https://lore.kernel.org/r/20241213-work-mount-rbtree-lockless-v3-7-6e3cdaf9b280@kernel.org Reviewed-by: Jeff Layton Signed-off-by: Christian Brauner --- diff --git a/tools/testing/selftests/filesystems/nsfs/.gitignore b/tools/testing/selftests/filesystems/nsfs/.gitignore new file mode 100644 index 000000000000..ed79ebdf286e --- /dev/null +++ b/tools/testing/selftests/filesystems/nsfs/.gitignore @@ -0,0 +1,3 @@ +# SPDX-License-Identifier: GPL-2.0-only +owner +pidns diff --git a/tools/testing/selftests/filesystems/nsfs/Makefile b/tools/testing/selftests/filesystems/nsfs/Makefile new file mode 100644 index 000000000000..c2f3ca6e488e --- /dev/null +++ b/tools/testing/selftests/filesystems/nsfs/Makefile @@ -0,0 +1,6 @@ +# SPDX-License-Identifier: GPL-2.0-only +TEST_GEN_PROGS := owner pidns + +CFLAGS := -Wall -Werror + +include ../../lib.mk diff --git a/tools/testing/selftests/filesystems/nsfs/config b/tools/testing/selftests/filesystems/nsfs/config new file mode 100644 index 000000000000..598d0a225fc9 --- /dev/null +++ b/tools/testing/selftests/filesystems/nsfs/config @@ -0,0 +1,3 @@ +CONFIG_USER_NS=y +CONFIG_UTS_NS=y +CONFIG_PID_NS=y diff --git a/tools/testing/selftests/filesystems/nsfs/owner.c b/tools/testing/selftests/filesystems/nsfs/owner.c new file mode 100644 index 000000000000..96a976c74550 --- /dev/null +++ b/tools/testing/selftests/filesystems/nsfs/owner.c @@ -0,0 +1,92 @@ +// SPDX-License-Identifier: GPL-2.0 +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define NSIO 0xb7 +#define NS_GET_USERNS _IO(NSIO, 0x1) + +#define pr_err(fmt, ...) \ + ({ \ + fprintf(stderr, "%s:%d:" fmt ": %m\n", \ + __func__, __LINE__, ##__VA_ARGS__); \ + 1; \ + }) + +int main(int argc, char *argvp[]) +{ + int pfd[2], ns, uns, init_uns; + struct stat st1, st2; + char path[128]; + pid_t pid; + char c; + + if (pipe(pfd)) + return 1; + + pid = fork(); + if (pid < 0) + return pr_err("fork"); + if (pid == 0) { + prctl(PR_SET_PDEATHSIG, SIGKILL); + if (unshare(CLONE_NEWUTS | CLONE_NEWUSER)) + return pr_err("unshare"); + close(pfd[0]); + close(pfd[1]); + while (1) + sleep(1); + return 0; + } + close(pfd[1]); + if (read(pfd[0], &c, 1) != 0) + return pr_err("Unable to read from pipe"); + close(pfd[0]); + + snprintf(path, sizeof(path), "/proc/%d/ns/uts", pid); + ns = open(path, O_RDONLY); + if (ns < 0) + return pr_err("Unable to open %s", path); + + uns = ioctl(ns, NS_GET_USERNS); + if (uns < 0) + return pr_err("Unable to get an owning user namespace"); + + if (fstat(uns, &st1)) + return pr_err("fstat"); + + snprintf(path, sizeof(path), "/proc/%d/ns/user", pid); + if (stat(path, &st2)) + return pr_err("stat"); + + if (st1.st_ino != st2.st_ino) + return pr_err("NS_GET_USERNS returned a wrong namespace"); + + init_uns = ioctl(uns, NS_GET_USERNS); + if (uns < 0) + return pr_err("Unable to get an owning user namespace"); + + if (ioctl(init_uns, NS_GET_USERNS) >= 0 || errno != EPERM) + return pr_err("Don't get EPERM"); + + if (unshare(CLONE_NEWUSER)) + return pr_err("unshare"); + + if (ioctl(ns, NS_GET_USERNS) >= 0 || errno != EPERM) + return pr_err("Don't get EPERM"); + if (ioctl(init_uns, NS_GET_USERNS) >= 0 || errno != EPERM) + return pr_err("Don't get EPERM"); + + kill(pid, SIGKILL); + wait(NULL); + return 0; +} diff --git a/tools/testing/selftests/filesystems/nsfs/pidns.c b/tools/testing/selftests/filesystems/nsfs/pidns.c new file mode 100644 index 000000000000..e3c772c6a7c7 --- /dev/null +++ b/tools/testing/selftests/filesystems/nsfs/pidns.c @@ -0,0 +1,79 @@ +// SPDX-License-Identifier: GPL-2.0 +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define pr_err(fmt, ...) \ + ({ \ + fprintf(stderr, "%s:%d:" fmt ": %m\n", \ + __func__, __LINE__, ##__VA_ARGS__); \ + 1; \ + }) + +#define NSIO 0xb7 +#define NS_GET_USERNS _IO(NSIO, 0x1) +#define NS_GET_PARENT _IO(NSIO, 0x2) + +#define __stack_aligned__ __attribute__((aligned(16))) +struct cr_clone_arg { + char stack[128] __stack_aligned__; + char stack_ptr[]; +}; + +static int child(void *args) +{ + prctl(PR_SET_PDEATHSIG, SIGKILL); + while (1) + sleep(1); + exit(0); +} + +int main(int argc, char *argv[]) +{ + char *ns_strs[] = {"pid", "user"}; + char path[] = "/proc/0123456789/ns/pid"; + struct cr_clone_arg ca; + struct stat st1, st2; + int ns, pns, i; + pid_t pid; + + pid = clone(child, ca.stack_ptr, CLONE_NEWUSER | CLONE_NEWPID | SIGCHLD, NULL); + if (pid < 0) + return pr_err("clone"); + + for (i = 0; i < 2; i++) { + snprintf(path, sizeof(path), "/proc/%d/ns/%s", pid, ns_strs[i]); + ns = open(path, O_RDONLY); + if (ns < 0) + return pr_err("Unable to open %s", path); + + pns = ioctl(ns, NS_GET_PARENT); + if (pns < 0) + return pr_err("Unable to get a parent pidns"); + + snprintf(path, sizeof(path), "/proc/self/ns/%s", ns_strs[i]); + if (stat(path, &st2)) + return pr_err("Unable to stat %s", path); + if (fstat(pns, &st1)) + return pr_err("Unable to stat the parent pidns"); + if (st1.st_ino != st2.st_ino) + return pr_err("NS_GET_PARENT returned a wrong namespace"); + + if (ioctl(pns, NS_GET_PARENT) >= 0 || errno != EPERM) + return pr_err("Don't get EPERM"); + } + + kill(pid, SIGKILL); + wait(NULL); + return 0; +} diff --git a/tools/testing/selftests/nsfs/.gitignore b/tools/testing/selftests/nsfs/.gitignore deleted file mode 100644 index ed79ebdf286e..000000000000 --- a/tools/testing/selftests/nsfs/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0-only -owner -pidns diff --git a/tools/testing/selftests/nsfs/Makefile b/tools/testing/selftests/nsfs/Makefile deleted file mode 100644 index dd9bd50b7b93..000000000000 --- a/tools/testing/selftests/nsfs/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0-only -TEST_GEN_PROGS := owner pidns - -CFLAGS := -Wall -Werror - -include ../lib.mk diff --git a/tools/testing/selftests/nsfs/config b/tools/testing/selftests/nsfs/config deleted file mode 100644 index 598d0a225fc9..000000000000 --- a/tools/testing/selftests/nsfs/config +++ /dev/null @@ -1,3 +0,0 @@ -CONFIG_USER_NS=y -CONFIG_UTS_NS=y -CONFIG_PID_NS=y diff --git a/tools/testing/selftests/nsfs/owner.c b/tools/testing/selftests/nsfs/owner.c deleted file mode 100644 index 96a976c74550..000000000000 --- a/tools/testing/selftests/nsfs/owner.c +++ /dev/null @@ -1,92 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -#define _GNU_SOURCE -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define NSIO 0xb7 -#define NS_GET_USERNS _IO(NSIO, 0x1) - -#define pr_err(fmt, ...) \ - ({ \ - fprintf(stderr, "%s:%d:" fmt ": %m\n", \ - __func__, __LINE__, ##__VA_ARGS__); \ - 1; \ - }) - -int main(int argc, char *argvp[]) -{ - int pfd[2], ns, uns, init_uns; - struct stat st1, st2; - char path[128]; - pid_t pid; - char c; - - if (pipe(pfd)) - return 1; - - pid = fork(); - if (pid < 0) - return pr_err("fork"); - if (pid == 0) { - prctl(PR_SET_PDEATHSIG, SIGKILL); - if (unshare(CLONE_NEWUTS | CLONE_NEWUSER)) - return pr_err("unshare"); - close(pfd[0]); - close(pfd[1]); - while (1) - sleep(1); - return 0; - } - close(pfd[1]); - if (read(pfd[0], &c, 1) != 0) - return pr_err("Unable to read from pipe"); - close(pfd[0]); - - snprintf(path, sizeof(path), "/proc/%d/ns/uts", pid); - ns = open(path, O_RDONLY); - if (ns < 0) - return pr_err("Unable to open %s", path); - - uns = ioctl(ns, NS_GET_USERNS); - if (uns < 0) - return pr_err("Unable to get an owning user namespace"); - - if (fstat(uns, &st1)) - return pr_err("fstat"); - - snprintf(path, sizeof(path), "/proc/%d/ns/user", pid); - if (stat(path, &st2)) - return pr_err("stat"); - - if (st1.st_ino != st2.st_ino) - return pr_err("NS_GET_USERNS returned a wrong namespace"); - - init_uns = ioctl(uns, NS_GET_USERNS); - if (uns < 0) - return pr_err("Unable to get an owning user namespace"); - - if (ioctl(init_uns, NS_GET_USERNS) >= 0 || errno != EPERM) - return pr_err("Don't get EPERM"); - - if (unshare(CLONE_NEWUSER)) - return pr_err("unshare"); - - if (ioctl(ns, NS_GET_USERNS) >= 0 || errno != EPERM) - return pr_err("Don't get EPERM"); - if (ioctl(init_uns, NS_GET_USERNS) >= 0 || errno != EPERM) - return pr_err("Don't get EPERM"); - - kill(pid, SIGKILL); - wait(NULL); - return 0; -} diff --git a/tools/testing/selftests/nsfs/pidns.c b/tools/testing/selftests/nsfs/pidns.c deleted file mode 100644 index e3c772c6a7c7..000000000000 --- a/tools/testing/selftests/nsfs/pidns.c +++ /dev/null @@ -1,79 +0,0 @@ -// SPDX-License-Identifier: GPL-2.0 -#define _GNU_SOURCE -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define pr_err(fmt, ...) \ - ({ \ - fprintf(stderr, "%s:%d:" fmt ": %m\n", \ - __func__, __LINE__, ##__VA_ARGS__); \ - 1; \ - }) - -#define NSIO 0xb7 -#define NS_GET_USERNS _IO(NSIO, 0x1) -#define NS_GET_PARENT _IO(NSIO, 0x2) - -#define __stack_aligned__ __attribute__((aligned(16))) -struct cr_clone_arg { - char stack[128] __stack_aligned__; - char stack_ptr[]; -}; - -static int child(void *args) -{ - prctl(PR_SET_PDEATHSIG, SIGKILL); - while (1) - sleep(1); - exit(0); -} - -int main(int argc, char *argv[]) -{ - char *ns_strs[] = {"pid", "user"}; - char path[] = "/proc/0123456789/ns/pid"; - struct cr_clone_arg ca; - struct stat st1, st2; - int ns, pns, i; - pid_t pid; - - pid = clone(child, ca.stack_ptr, CLONE_NEWUSER | CLONE_NEWPID | SIGCHLD, NULL); - if (pid < 0) - return pr_err("clone"); - - for (i = 0; i < 2; i++) { - snprintf(path, sizeof(path), "/proc/%d/ns/%s", pid, ns_strs[i]); - ns = open(path, O_RDONLY); - if (ns < 0) - return pr_err("Unable to open %s", path); - - pns = ioctl(ns, NS_GET_PARENT); - if (pns < 0) - return pr_err("Unable to get a parent pidns"); - - snprintf(path, sizeof(path), "/proc/self/ns/%s", ns_strs[i]); - if (stat(path, &st2)) - return pr_err("Unable to stat %s", path); - if (fstat(pns, &st1)) - return pr_err("Unable to stat the parent pidns"); - if (st1.st_ino != st2.st_ino) - return pr_err("NS_GET_PARENT returned a wrong namespace"); - - if (ioctl(pns, NS_GET_PARENT) >= 0 || errno != EPERM) - return pr_err("Don't get EPERM"); - } - - kill(pid, SIGKILL); - wait(NULL); - return 0; -}