diff options
author | Christian Brauner | 2019-11-18 08:49:44 +0100 |
---|---|---|
committer | Christian Brauner | 2019-11-18 08:59:03 +0100 |
commit | 11fde161ab37f2938504bf896b48afbd18ea71cd (patch) | |
tree | a6469cc26af328bb9df220ec19732d1332d1390b | |
parent | a019ff3b8b10d1b7f5cd37edb9f4fbef3e031edf (diff) |
selftests/clone3: skip if clone3() is ENOSYS
If the clone3() syscall is not implemented we should skip the tests.
Fixes: 41585bbeeef9 ("selftests: add tests for clone3() with *set_tid")
Fixes: 17a810699c18 ("selftests: add tests for clone3()")
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
-rw-r--r-- | tools/testing/selftests/clone3/clone3.c | 1 | ||||
-rw-r--r-- | tools/testing/selftests/clone3/clone3_clear_sighand.c | 29 | ||||
-rw-r--r-- | tools/testing/selftests/clone3/clone3_selftests.h | 26 | ||||
-rw-r--r-- | tools/testing/selftests/clone3/clone3_set_tid.c | 7 |
4 files changed, 33 insertions, 30 deletions
diff --git a/tools/testing/selftests/clone3/clone3.c b/tools/testing/selftests/clone3/clone3.c index 4669b3d418e7..f14c269a5a18 100644 --- a/tools/testing/selftests/clone3/clone3.c +++ b/tools/testing/selftests/clone3/clone3.c @@ -131,6 +131,7 @@ int main(int argc, char *argv[]) uid_t uid = getuid(); + test_clone3_supported(); ksft_print_header(); ksft_set_plan(17); diff --git a/tools/testing/selftests/clone3/clone3_clear_sighand.c b/tools/testing/selftests/clone3/clone3_clear_sighand.c index 456783ad19d6..9e1af8aa7698 100644 --- a/tools/testing/selftests/clone3/clone3_clear_sighand.c +++ b/tools/testing/selftests/clone3/clone3_clear_sighand.c @@ -20,32 +20,6 @@ #define CLONE_CLEAR_SIGHAND 0x100000000ULL #endif -static void test_clone3_supported(void) -{ - pid_t pid; - struct clone_args args = {}; - - if (__NR_clone3 < 0) - ksft_exit_skip("clone3() syscall is not supported\n"); - - /* Set to something that will always cause EINVAL. */ - args.exit_signal = -1; - pid = sys_clone3(&args, sizeof(args)); - if (!pid) - exit(EXIT_SUCCESS); - - if (pid > 0) { - wait(NULL); - ksft_exit_fail_msg( - "Managed to create child process with invalid exit_signal\n"); - } - - if (errno == ENOSYS) - ksft_exit_skip("clone3() syscall is not supported\n"); - - ksft_print_msg("clone3() syscall supported\n"); -} - static void nop_handler(int signo) { } @@ -145,9 +119,10 @@ static void test_clone3_clear_sighand(void) int main(int argc, char **argv) { ksft_print_header(); + test_clone3_supported(); + ksft_set_plan(1); - test_clone3_supported(); test_clone3_clear_sighand(); return ksft_exit_pass(); diff --git a/tools/testing/selftests/clone3/clone3_selftests.h b/tools/testing/selftests/clone3/clone3_selftests.h index 0e3dea58855f..a3f2c8ad8bcc 100644 --- a/tools/testing/selftests/clone3/clone3_selftests.h +++ b/tools/testing/selftests/clone3/clone3_selftests.h @@ -34,4 +34,30 @@ static pid_t sys_clone3(struct clone_args *args, size_t size) return syscall(__NR_clone3, args, size); } +static inline void test_clone3_supported(void) +{ + pid_t pid; + struct clone_args args = {}; + + if (__NR_clone3 < 0) + ksft_exit_skip("clone3() syscall is not supported\n"); + + /* Set to something that will always cause EINVAL. */ + args.exit_signal = -1; + pid = sys_clone3(&args, sizeof(args)); + if (!pid) + exit(EXIT_SUCCESS); + + if (pid > 0) { + wait(NULL); + ksft_exit_fail_msg( + "Managed to create child process with invalid exit_signal\n"); + } + + if (errno == ENOSYS) + ksft_exit_skip("clone3() syscall is not supported\n"); + + ksft_print_msg("clone3() syscall supported\n"); +} + #endif /* _CLONE3_SELFTESTS_H */ diff --git a/tools/testing/selftests/clone3/clone3_set_tid.c b/tools/testing/selftests/clone3/clone3_set_tid.c index c6309f5d7d88..25beb22f35b5 100644 --- a/tools/testing/selftests/clone3/clone3_set_tid.c +++ b/tools/testing/selftests/clone3/clone3_set_tid.c @@ -156,12 +156,13 @@ int main(int argc, char *argv[]) pid_t pid, ns1, ns2, ns3, ns_pid; pid_t set_tid[MAX_PID_NS_LEVEL * 2]; - if (pipe(pipe_1) < 0 || pipe(pipe_2) < 0) - ksft_exit_fail_msg("pipe() failed\n"); - ksft_print_header(); + test_clone3_supported(); ksft_set_plan(29); + if (pipe(pipe_1) < 0 || pipe(pipe_2) < 0) + ksft_exit_fail_msg("pipe() failed\n"); + f = fopen("/proc/sys/kernel/pid_max", "r"); if (f == NULL) ksft_exit_fail_msg( |