From 193a7a65b6c6b159c11768a19e8e5f88419f1d2f Mon Sep 17 00:00:00 2001 From: Masatake YAMATO Date: Sun, 2 Jun 2024 01:57:20 +0900 Subject: [PATCH] tests: verify the auxstr of clone3(2) when --namespace=new is given * tests/gen_tests.in (clone3-report-ns-id): New test. * tests/pure_executables.list: Add clone3-report-ns-id. * tests/clone3-report-ns-id.c: New fle. * tests/.gitignore: Add clone3-report-ns-id. Signed-off-by: Masatake YAMATO --- tests/.gitignore | 1 + tests/clone3-report-ns-id.c | 71 +++++++++++++++++++++++++++++++++++++ tests/gen_tests.in | 1 + tests/pure_executables.list | 1 + 4 files changed, 74 insertions(+) create mode 100644 tests/clone3-report-ns-id.c diff --git a/tests/.gitignore b/tests/.gitignore index 33a40eb692..8e431bbd6b 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -72,6 +72,7 @@ clone3 clone3-Xabbrev clone3-Xraw clone3-Xverbose +clone3-report-ns-id clone3-success clone3-success-Xabbrev clone3-success-Xraw diff --git a/tests/clone3-report-ns-id.c b/tests/clone3-report-ns-id.c new file mode 100644 index 0000000000..598794a584 --- /dev/null +++ b/tests/clone3-report-ns-id.c @@ -0,0 +1,71 @@ +/* + * Check appending auxstr of clone3(2) when --namespace=switchTo is given + * + * Copyright (c) 2024 The strace developers. + * All rights reserved. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "tests.h" +#include "xmalloc.h" + +#include +#include +#include +#include +#include +#include + +#include "scno.h" + +static void +retrieve_userns(int pid, char *userns_buf, size_t userns_buflen, int fd) +{ + char c = 0; + if (read(fd, &c, 1) != 1) + perror_msg_and_fail("read from the child"); + + char *fname = xasprintf("/proc/%d/ns/user", pid); + int rc = readlink(fname, userns_buf, userns_buflen - 1); + if ((unsigned int) rc >= userns_buflen) + perror_msg_and_fail("readlink"); + userns_buf[rc] = '\0'; + + if (write(fd, &c, 1) != 1) + perror_msg_and_fail("write to the child"); +} + +static void +child_pause(int fd) +{ + char c = 0; + if (write(fd, &c, 1) != 1) + return; + if (read(fd, &c, 1) != 1) + return; +} + +int +main(void) +{ + static int child_sockpair[2]; + if (socketpair(AF_UNIX, SOCK_STREAM, 0, child_sockpair) < 0) + perror_msg_and_fail("socketpair"); + + struct clone_args arg = { .flags = CLONE_NEWUSER }; + int pid = syscall(__NR_clone3, &arg, sizeof(arg)); + if (pid < 0) + perror_msg_and_fail("clone3"); + if (pid > 0) { + printf("clone3({flags=CLONE_NEWUSER, exit_signal=0, stack=NULL, stack_size=0}" + ", %zu) = %s ", sizeof(arg), sprintrc(pid)); + + char userns[PATH_MAX]; + retrieve_userns(pid, userns, sizeof(userns), child_sockpair[0]); + printf("(%s)\n", userns); + puts("+++ exited with 0 +++"); + } else + child_pause(child_sockpair[1]); + return 0; +} diff --git a/tests/gen_tests.in b/tests/gen_tests.in index 59105e61fc..19365b9322 100644 --- a/tests/gen_tests.in +++ b/tests/gen_tests.in @@ -66,6 +66,7 @@ clone3-success-Xabbrev -einject=clone3:retval=42 -etrace=clone3 -a16 -Xabbrev clone3-success-Xraw -einject=clone3:retval=42 -etrace=clone3 -a16 -Xraw clone3-success-Xverbose -einject=clone3:retval=42 -etrace=clone3 -a16 -Xverbose clone_parent +clone_ptrace.test +clone3-report-ns-id -etrace=clone3 -a35 -enamespace=now clone_parent--quiet-exit +clone_ptrace.test --quiet=exit,personality clone_parent-q +clone_ptrace.test -q clone_parent-qq +clone_ptrace.test -qq diff --git a/tests/pure_executables.list b/tests/pure_executables.list index 8418b4d6e8..f92dfd47d8 100755 --- a/tests/pure_executables.list +++ b/tests/pure_executables.list @@ -44,6 +44,7 @@ clone3 clone3-Xabbrev clone3-Xraw clone3-Xverbose +clone3-report-ns-id copy_file_range creat delete_module