selftests/clone3: flush stdout and stderr before clone3() and _exit()
authorAndrei Vagin <avagin@gmail.com>
Mon, 18 Nov 2019 06:47:48 +0000 (22:47 -0800)
committerChristian Brauner <christian.brauner@ubuntu.com>
Mon, 18 Nov 2019 07:57:23 +0000 (08:57 +0100)
Buffers have to be flushed before clone3() to avoid double messages in
the log.

Fixes: 41585bbeeef9 ("selftests: add tests for clone3() with *set_tid")
Signed-off-by: Andrei Vagin <avagin@gmail.com>
Link: https://lore.kernel.org/r/20191118064750.408003-1-avagin@gmail.com
Signed-off-by: Christian Brauner <christian.brauner@ubuntu.com>
tools/testing/selftests/clone3/clone3_selftests.h
tools/testing/selftests/clone3/clone3_set_tid.c

index 1a270390766a87b5569e9999d35107b58b25412a..0e3dea58855f78b1fb9adc43ebe09cf246137f3c 100644 (file)
@@ -29,6 +29,8 @@ struct clone_args {
 
 static pid_t sys_clone3(struct clone_args *args, size_t size)
 {
+       fflush(stdout);
+       fflush(stderr);
        return syscall(__NR_clone3, args, size);
 }
 
index 3480e1c46983d7120f6aa5c58fea03561d19e081..e93369dcfe3be8639ca57c8e091e02797f15b8c5 100644 (file)
 static int pipe_1[2];
 static int pipe_2[2];
 
+static void child_exit(int ret)
+{
+       fflush(stdout);
+       fflush(stderr);
+       _exit(ret);
+}
+
 static int call_clone3_set_tid(pid_t *set_tid,
                               size_t set_tid_size,
                               int flags,
@@ -84,8 +91,8 @@ static int call_clone3_set_tid(pid_t *set_tid,
                }
 
                if (set_tid[0] != getpid())
-                       _exit(EXIT_FAILURE);
-               _exit(exit_code);
+                       child_exit(EXIT_FAILURE);
+               child_exit(exit_code);
        }
 
        if (expected_pid == 0 || expected_pid == pid) {
@@ -249,7 +256,7 @@ int main(int argc, char *argv[])
        pid = fork();
        if (pid == 0) {
                ksft_print_msg("Child has PID %d\n", getpid());
-               _exit(EXIT_SUCCESS);
+               child_exit(EXIT_SUCCESS);
        }
        if (waitpid(pid, &status, 0) < 0)
                ksft_exit_fail_msg("Waiting for child %d failed", pid);
@@ -309,7 +316,7 @@ int main(int argc, char *argv[])
                 */
                test_clone3_set_tid(set_tid, 3, CLONE_NEWPID, 0, 42, true);
 
-               _exit(ksft_cnt.ksft_pass);
+               child_exit(ksft_cnt.ksft_pass);
        }
 
        close(pipe_1[1]);