mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-24 04:34:08 +08:00
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: 41cca0542d
("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>
This commit is contained in:
parent
fff37bd32c
commit
a86f18903d
@ -66,6 +66,8 @@
|
||||
#include <sys/wait.h>
|
||||
#include <unistd.h>
|
||||
#include <setjmp.h>
|
||||
#include <syscall.h>
|
||||
#include <linux/sched.h>
|
||||
|
||||
#include "kselftest.h"
|
||||
|
||||
@ -80,6 +82,17 @@
|
||||
# define TH_LOG_ENABLED 1
|
||||
#endif
|
||||
|
||||
/* Wait for the child process to end but without sharing memory mapping. */
|
||||
static inline pid_t clone3_vfork(void)
|
||||
{
|
||||
struct clone_args args = {
|
||||
.flags = CLONE_VFORK,
|
||||
.exit_signal = SIGCHLD,
|
||||
};
|
||||
|
||||
return syscall(__NR_clone3, &args, sizeof(args));
|
||||
}
|
||||
|
||||
/**
|
||||
* TH_LOG()
|
||||
*
|
||||
@ -1183,7 +1196,7 @@ void __run_test(struct __fixture_metadata *f,
|
||||
fflush(stdout);
|
||||
fflush(stderr);
|
||||
|
||||
t->pid = fork();
|
||||
t->pid = clone3_vfork();
|
||||
if (t->pid < 0) {
|
||||
ksft_print_msg("ERROR SPAWNING TEST CHILD\n");
|
||||
t->exit_code = KSFT_FAIL;
|
||||
|
Loading…
Reference in New Issue
Block a user