Commit 11fde161 authored by Christian Brauner's avatar Christian Brauner

selftests/clone3: skip if clone3() is ENOSYS

If the clone3() syscall is not implemented we should skip the tests.

Fixes: 41585bbe ("selftests: add tests for clone3() with *set_tid")
Fixes: 17a81069 ("selftests: add tests for clone3()")
Signed-off-by: default avatarChristian Brauner <christian.brauner@ubuntu.com>
parent a019ff3b
...@@ -131,6 +131,7 @@ int main(int argc, char *argv[]) ...@@ -131,6 +131,7 @@ int main(int argc, char *argv[])
uid_t uid = getuid(); uid_t uid = getuid();
test_clone3_supported();
ksft_print_header(); ksft_print_header();
ksft_set_plan(17); ksft_set_plan(17);
......
...@@ -20,32 +20,6 @@ ...@@ -20,32 +20,6 @@
#define CLONE_CLEAR_SIGHAND 0x100000000ULL #define CLONE_CLEAR_SIGHAND 0x100000000ULL
#endif #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) static void nop_handler(int signo)
{ {
} }
...@@ -145,9 +119,10 @@ static void test_clone3_clear_sighand(void) ...@@ -145,9 +119,10 @@ static void test_clone3_clear_sighand(void)
int main(int argc, char **argv) int main(int argc, char **argv)
{ {
ksft_print_header(); ksft_print_header();
test_clone3_supported();
ksft_set_plan(1); ksft_set_plan(1);
test_clone3_supported();
test_clone3_clear_sighand(); test_clone3_clear_sighand();
return ksft_exit_pass(); return ksft_exit_pass();
......
...@@ -34,4 +34,30 @@ static pid_t sys_clone3(struct clone_args *args, size_t size) ...@@ -34,4 +34,30 @@ static pid_t sys_clone3(struct clone_args *args, size_t size)
return syscall(__NR_clone3, args, 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 */ #endif /* _CLONE3_SELFTESTS_H */
...@@ -156,12 +156,13 @@ int main(int argc, char *argv[]) ...@@ -156,12 +156,13 @@ int main(int argc, char *argv[])
pid_t pid, ns1, ns2, ns3, ns_pid; pid_t pid, ns1, ns2, ns3, ns_pid;
pid_t set_tid[MAX_PID_NS_LEVEL * 2]; 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(); ksft_print_header();
test_clone3_supported();
ksft_set_plan(29); 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"); f = fopen("/proc/sys/kernel/pid_max", "r");
if (f == NULL) if (f == NULL)
ksft_exit_fail_msg( ksft_exit_fail_msg(
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment