Skip to content

Commit f5eded1

Browse files
committed
Merge tag 'kernel.fork.v6.3-rc2' of gitolite.kernel.org:pub/scm/linux/kernel/git/brauner/linux
Pull clone3 fix from Christian Brauner: "A simple fix for the clone3() system call. The CLONE_NEWTIME allows the creation of time namespaces. The flag reuses a bit from the CSIGNAL bits that are used in the legacy clone() system call to set the signal that gets sent to the parent after the child exits. The clone3() system call doesn't rely on CSIGNAL anymore as it uses a dedicated .exit_signal field in struct clone_args. So we blocked all CSIGNAL bits in clone3_args_valid(). When CLONE_NEWTIME was introduced and reused a CSIGNAL bit we forgot to adapt clone3_args_valid() causing CLONE_NEWTIME with clone3() to be rejected. Fix this" * tag 'kernel.fork.v6.3-rc2' of gitolite.kernel.org:pub/scm/linux/kernel/git/brauner/linux: selftests/clone3: test clone3 with CLONE_NEWTIME fork: allow CLONE_NEWTIME in clone3 flags
2 parents 3b11717 + 515bddf commit f5eded1

File tree

2 files changed

+4
-1
lines changed

2 files changed

+4
-1
lines changed

kernel/fork.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2936,7 +2936,7 @@ static bool clone3_args_valid(struct kernel_clone_args *kargs)
29362936
* - make the CLONE_DETACHED bit reusable for clone3
29372937
* - make the CSIGNAL bits reusable for clone3
29382938
*/
2939-
if (kargs->flags & (CLONE_DETACHED | CSIGNAL))
2939+
if (kargs->flags & (CLONE_DETACHED | (CSIGNAL & (~CLONE_NEWTIME))))
29402940
return false;
29412941

29422942
if ((kargs->flags & (CLONE_SIGHAND | CLONE_CLEAR_SIGHAND)) ==

tools/testing/selftests/clone3/clone3.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,5 +195,8 @@ int main(int argc, char *argv[])
195195
test_clone3(CLONE_NEWPID, getpagesize() + 8, -E2BIG,
196196
CLONE3_ARGS_NO_TEST);
197197

198+
/* Do a clone3() in a new time namespace */
199+
test_clone3(CLONE_NEWTIME, 0, 0, CLONE3_ARGS_NO_TEST);
200+
198201
return !ksft_get_fail_cnt() ? ksft_exit_pass() : ksft_exit_fail();
199202
}

0 commit comments

Comments
 (0)