Skip to content

Commit a86f189

Browse files
committed
selftests/harness: Fix interleaved scheduling leading to race conditions
Fix a race condition when running several FIXTURE_TEARDOWN() managing the same resource. This fixes a race condition in the Landlock file system tests when creating or unmounting the same directory. Using clone3() with CLONE_VFORK guarantees that the child and grandchild test processes are sequentially scheduled. This is implemented with a new clone3_vfork() helper replacing the fork() call. This avoids triggering this error in __wait_for_test(): Test ended in some other way [127] Cc: Christian Brauner <brauner@kernel.org> Cc: David S. Miller <davem@davemloft.net> Cc: Günther Noack <gnoack@google.com> Cc: Jakub Kicinski <kuba@kernel.org> Cc: Mark Brown <broonie@kernel.org> Cc: Shuah Khan <shuah@kernel.org> Cc: Will Drewry <wad@chromium.org> Fixes: 41cca05 ("selftests/harness: Fix TEST_F()'s vfork handling") Reviewed-by: Kees Cook <keescook@chromium.org> Link: https://lore.kernel.org/r/20240511171445.904356-5-mic@digikod.net Signed-off-by: Mickaël Salaün <mic@digikod.net>
1 parent fff37bd commit a86f189

1 file changed

Lines changed: 14 additions & 1 deletion

File tree

tools/testing/selftests/kselftest_harness.h

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@
6666
#include <sys/wait.h>
6767
#include <unistd.h>
6868
#include <setjmp.h>
69+
#include <syscall.h>
70+
#include <linux/sched.h>
6971

7072
#include "kselftest.h"
7173

@@ -80,6 +82,17 @@
8082
# define TH_LOG_ENABLED 1
8183
#endif
8284

85+
/* Wait for the child process to end but without sharing memory mapping. */
86+
static inline pid_t clone3_vfork(void)
87+
{
88+
struct clone_args args = {
89+
.flags = CLONE_VFORK,
90+
.exit_signal = SIGCHLD,
91+
};
92+
93+
return syscall(__NR_clone3, &args, sizeof(args));
94+
}
95+
8396
/**
8497
* TH_LOG()
8598
*
@@ -1183,7 +1196,7 @@ void __run_test(struct __fixture_metadata *f,
11831196
fflush(stdout);
11841197
fflush(stderr);
11851198

1186-
t->pid = fork();
1199+
t->pid = clone3_vfork();
11871200
if (t->pid < 0) {
11881201
ksft_print_msg("ERROR SPAWNING TEST CHILD\n");
11891202
t->exit_code = KSFT_FAIL;

0 commit comments

Comments
 (0)