selftests/clone3: Avoid OS-defined clone_args
authorKees Cook <keescook@chromium.org>
Sat, 12 Sep 2020 11:08:19 +0000 (04:08 -0700)
committerKees Cook <keescook@chromium.org>
Thu, 8 Oct 2020 20:17:25 +0000 (13:17 -0700)
As the UAPI headers start to appear in distros, we need to avoid
outdated versions of struct clone_args to be able to test modern
features, named "struct __clone_args". Additionally update the struct
size macro names to match UAPI names.

Acked-by: Christian Brauner <christian.brauner@ubuntu.com>
Link: https://lore.kernel.org/lkml/20200921075432.u4gis3s2o5qrsb5g@wittgenstein/
Signed-off-by: Kees Cook <keescook@chromium.org>
tools/testing/selftests/clone3/clone3.c
tools/testing/selftests/clone3/clone3_cap_checkpoint_restore.c
tools/testing/selftests/clone3/clone3_clear_sighand.c
tools/testing/selftests/clone3/clone3_selftests.h
tools/testing/selftests/clone3/clone3_set_tid.c
tools/testing/selftests/pidfd/pidfd_setns_test.c
tools/testing/selftests/seccomp/seccomp_bpf.c

index b7e6dec36173d2812b8c4ab017f3565e37eb81b2..42be3b9258301e87823edfe7284142fca5d49158 100644 (file)
 #include "../kselftest.h"
 #include "clone3_selftests.h"
 
-/*
- * Different sizes of struct clone_args
- */
-#ifndef CLONE3_ARGS_SIZE_V0
-#define CLONE3_ARGS_SIZE_V0 64
-#endif
-
 enum test_mode {
        CLONE3_ARGS_NO_TEST,
        CLONE3_ARGS_ALL_0,
@@ -38,13 +31,13 @@ enum test_mode {
 
 static int call_clone3(uint64_t flags, size_t size, enum test_mode test_mode)
 {
-       struct clone_args args = {
+       struct __clone_args args = {
                .flags = flags,
                .exit_signal = SIGCHLD,
        };
 
        struct clone_args_extended {
-               struct clone_args args;
+               struct __clone_args args;
                __aligned_u64 excess_space[2];
        } args_ext;
 
@@ -52,11 +45,11 @@ static int call_clone3(uint64_t flags, size_t size, enum test_mode test_mode)
        int status;
 
        memset(&args_ext, 0, sizeof(args_ext));
-       if (size > sizeof(struct clone_args))
+       if (size > sizeof(struct __clone_args))
                args_ext.excess_space[1] = 1;
 
        if (size == 0)
-               size = sizeof(struct clone_args);
+               size = sizeof(struct __clone_args);
 
        switch (test_mode) {
        case CLONE3_ARGS_ALL_0:
@@ -77,9 +70,9 @@ static int call_clone3(uint64_t flags, size_t size, enum test_mode test_mode)
                break;
        }
 
-       memcpy(&args_ext.args, &args, sizeof(struct clone_args));
+       memcpy(&args_ext.args, &args, sizeof(struct __clone_args));
 
-       pid = sys_clone3((struct clone_args *)&args_ext, size);
+       pid = sys_clone3((struct __clone_args *)&args_ext, size);
        if (pid < 0) {
                ksft_print_msg("%s - Failed to create new process\n",
                                strerror(errno));
@@ -144,14 +137,14 @@ int main(int argc, char *argv[])
        else
                ksft_test_result_skip("Skipping clone3() with CLONE_NEWPID\n");
 
-       /* Do a clone3() with CLONE3_ARGS_SIZE_V0. */
-       test_clone3(0, CLONE3_ARGS_SIZE_V0, 0, CLONE3_ARGS_NO_TEST);
+       /* Do a clone3() with CLONE_ARGS_SIZE_VER0. */
+       test_clone3(0, CLONE_ARGS_SIZE_VER0, 0, CLONE3_ARGS_NO_TEST);
 
-       /* Do a clone3() with CLONE3_ARGS_SIZE_V0 - 8 */
-       test_clone3(0, CLONE3_ARGS_SIZE_V0 - 8, -EINVAL, CLONE3_ARGS_NO_TEST);
+       /* Do a clone3() with CLONE_ARGS_SIZE_VER0 - 8 */
+       test_clone3(0, CLONE_ARGS_SIZE_VER0 - 8, -EINVAL, CLONE3_ARGS_NO_TEST);
 
        /* Do a clone3() with sizeof(struct clone_args) + 8 */
-       test_clone3(0, sizeof(struct clone_args) + 8, 0, CLONE3_ARGS_NO_TEST);
+       test_clone3(0, sizeof(struct __clone_args) + 8, 0, CLONE3_ARGS_NO_TEST);
 
        /* Do a clone3() with exit_signal having highest 32 bits non-zero */
        test_clone3(0, 0, -EINVAL, CLONE3_ARGS_INVAL_EXIT_SIGNAL_BIG);
@@ -165,31 +158,31 @@ int main(int argc, char *argv[])
        /* Do a clone3() with NSIG < exit_signal < CSIG */
        test_clone3(0, 0, -EINVAL, CLONE3_ARGS_INVAL_EXIT_SIGNAL_NSIG);
 
-       test_clone3(0, sizeof(struct clone_args) + 8, 0, CLONE3_ARGS_ALL_0);
+       test_clone3(0, sizeof(struct __clone_args) + 8, 0, CLONE3_ARGS_ALL_0);
 
-       test_clone3(0, sizeof(struct clone_args) + 16, -E2BIG,
+       test_clone3(0, sizeof(struct __clone_args) + 16, -E2BIG,
                        CLONE3_ARGS_ALL_0);
 
-       test_clone3(0, sizeof(struct clone_args) * 2, -E2BIG,
+       test_clone3(0, sizeof(struct __clone_args) * 2, -E2BIG,
                        CLONE3_ARGS_ALL_0);
 
        /* Do a clone3() with > page size */
        test_clone3(0, getpagesize() + 8, -E2BIG, CLONE3_ARGS_NO_TEST);
 
-       /* Do a clone3() with CLONE3_ARGS_SIZE_V0 in a new PID NS. */
+       /* Do a clone3() with CLONE_ARGS_SIZE_VER0 in a new PID NS. */
        if (uid == 0)
-               test_clone3(CLONE_NEWPID, CLONE3_ARGS_SIZE_V0, 0,
+               test_clone3(CLONE_NEWPID, CLONE_ARGS_SIZE_VER0, 0,
                                CLONE3_ARGS_NO_TEST);
        else
                ksft_test_result_skip("Skipping clone3() with CLONE_NEWPID\n");
 
-       /* Do a clone3() with CLONE3_ARGS_SIZE_V0 - 8 in a new PID NS */
-       test_clone3(CLONE_NEWPID, CLONE3_ARGS_SIZE_V0 - 8, -EINVAL,
+       /* Do a clone3() with CLONE_ARGS_SIZE_VER0 - 8 in a new PID NS */
+       test_clone3(CLONE_NEWPID, CLONE_ARGS_SIZE_VER0 - 8, -EINVAL,
                        CLONE3_ARGS_NO_TEST);
 
        /* Do a clone3() with sizeof(struct clone_args) + 8 in a new PID NS */
        if (uid == 0)
-               test_clone3(CLONE_NEWPID, sizeof(struct clone_args) + 8, 0,
+               test_clone3(CLONE_NEWPID, sizeof(struct __clone_args) + 8, 0,
                                CLONE3_ARGS_NO_TEST);
        else
                ksft_test_result_skip("Skipping clone3() with CLONE_NEWPID\n");
index 9562425aa0a90c692e9674afa334cb96b4a6f9c7..55bd387ce7ec6ae45b2999652d7d7fbe13d56c5c 100644 (file)
@@ -44,13 +44,13 @@ static int call_clone3_set_tid(struct __test_metadata *_metadata,
        int status;
        pid_t pid = -1;
 
-       struct clone_args args = {
+       struct __clone_args args = {
                .exit_signal = SIGCHLD,
                .set_tid = ptr_to_u64(set_tid),
                .set_tid_size = set_tid_size,
        };
 
-       pid = sys_clone3(&args, sizeof(struct clone_args));
+       pid = sys_clone3(&args, sizeof(args));
        if (pid < 0) {
                TH_LOG("%s - Failed to create new process", strerror(errno));
                return -errno;
index db5fc9c5edcf370c82bc635f25e5a04d3dbddb69..47a8c0fc3676b8703f4e58d5be671e32a03b7d39 100644 (file)
@@ -47,7 +47,7 @@ static void test_clone3_clear_sighand(void)
 {
        int ret;
        pid_t pid;
-       struct clone_args args = {};
+       struct __clone_args args = {};
        struct sigaction act;
 
        /*
index 91c1a78ddb3914f25f75ffa0103b4106c15dd7cf..e81ffaaee02ba7701f8e1093c5c25dafa17fde77 100644 (file)
 #define CLONE_INTO_CGROUP 0x200000000ULL /* Clone into a specific cgroup given the right permissions. */
 #endif
 
-#ifndef CLONE_ARGS_SIZE_VER0
-#define CLONE_ARGS_SIZE_VER0 64
-#endif
-
 #ifndef __NR_clone3
 #define __NR_clone3 -1
-struct clone_args {
+#endif
+
+struct __clone_args {
        __aligned_u64 flags;
        __aligned_u64 pidfd;
        __aligned_u64 child_tid;
@@ -34,15 +32,21 @@ struct clone_args {
        __aligned_u64 stack;
        __aligned_u64 stack_size;
        __aligned_u64 tls;
-#define CLONE_ARGS_SIZE_VER1 80
+#ifndef CLONE_ARGS_SIZE_VER0
+#define CLONE_ARGS_SIZE_VER0 64        /* sizeof first published struct */
+#endif
        __aligned_u64 set_tid;
        __aligned_u64 set_tid_size;
-#define CLONE_ARGS_SIZE_VER2 88
+#ifndef CLONE_ARGS_SIZE_VER1
+#define CLONE_ARGS_SIZE_VER1 80        /* sizeof second published struct */
+#endif
        __aligned_u64 cgroup;
+#ifndef CLONE_ARGS_SIZE_VER2
+#define CLONE_ARGS_SIZE_VER2 88        /* sizeof third published struct */
+#endif
 };
-#endif /* __NR_clone3 */
 
-static pid_t sys_clone3(struct clone_args *args, size_t size)
+static pid_t sys_clone3(struct __clone_args *args, size_t size)
 {
        fflush(stdout);
        fflush(stderr);
@@ -52,7 +56,7 @@ static pid_t sys_clone3(struct clone_args *args, size_t size)
 static inline void test_clone3_supported(void)
 {
        pid_t pid;
-       struct clone_args args = {};
+       struct __clone_args args = {};
 
        if (__NR_clone3 < 0)
                ksft_exit_skip("clone3() syscall is not supported\n");
index 5831c1082d6d0fe025551d1b54f178ef51d62c1b..0229e9ebb995eb112c0289e7b1d4caab71834c53 100644 (file)
@@ -46,14 +46,14 @@ static int call_clone3_set_tid(pid_t *set_tid,
        int status;
        pid_t pid = -1;
 
-       struct clone_args args = {
+       struct __clone_args args = {
                .flags = flags,
                .exit_signal = SIGCHLD,
                .set_tid = ptr_to_u64(set_tid),
                .set_tid_size = set_tid_size,
        };
 
-       pid = sys_clone3(&args, sizeof(struct clone_args));
+       pid = sys_clone3(&args, sizeof(args));
        if (pid < 0) {
                ksft_print_msg("%s - Failed to create new process\n",
                               strerror(errno));
index 7dca1aa4672d2dace73422fa05f9fb868ca8f381..1f085b922c6ec1ccfe3422870f3d497039c60d15 100644 (file)
@@ -75,7 +75,7 @@ static int sys_waitid(int which, pid_t pid, int options)
 
 pid_t create_child(int *pidfd, unsigned flags)
 {
-       struct clone_args args = {
+       struct __clone_args args = {
                .flags          = CLONE_PIDFD | flags,
                .exit_signal    = SIGCHLD,
                .pidfd          = ptr_to_u64(pidfd),
index 894c2404d321af17facf1827dae2655a67a9cb52..4a180439ee9e524d12360d766fb65d189c558515 100644 (file)
@@ -3817,7 +3817,7 @@ TEST(user_notification_filter_empty)
        long ret;
        int status;
        struct pollfd pollfd;
-       struct clone_args args = {
+       struct __clone_args args = {
                .flags = CLONE_FILES,
                .exit_signal = SIGCHLD,
        };
@@ -3871,7 +3871,7 @@ TEST(user_notification_filter_empty_threaded)
        long ret;
        int status;
        struct pollfd pollfd;
-       struct clone_args args = {
+       struct __clone_args args = {
                .flags = CLONE_FILES,
                .exit_signal = SIGCHLD,
        };