[LTP] [PATCH v2] Add unshare(CLONE_NEWPID) test

Andrea Cervesato andrea.cervesato@suse.com
Mon Jul 14 13:49:29 CEST 2025


Hi!

On 7/14/25 4:19 AM, lufei wrote:
> Test unshare(CLONE_NEWPID) to make first child in new PID namespce get
> pid 1.
>
> Signed-off-by: lufei <lufei@uniontech.com>
> ---
>   runtest/syscalls                              |  1 +
>   testcases/kernel/syscalls/unshare/.gitignore  |  1 +
>   testcases/kernel/syscalls/unshare/unshare05.c | 47 +++++++++++++++++++
>   3 files changed, 49 insertions(+)
>   create mode 100644 testcases/kernel/syscalls/unshare/unshare05.c
>
> diff --git a/runtest/syscalls b/runtest/syscalls
> index 57338297a..82e222bf4 100644
> --- a/runtest/syscalls
> +++ b/runtest/syscalls
> @@ -1726,6 +1726,7 @@ unshare01 unshare01
>   unshare02 unshare02
>   unshare03 unshare03
>   unshare04 unshare04
> +unshare05 unshare05
>   
>   #
>   # These tests require an unmounted block device
> diff --git a/testcases/kernel/syscalls/unshare/.gitignore b/testcases/kernel/syscalls/unshare/.gitignore
> index b1206e452..8ece5f988 100644
> --- a/testcases/kernel/syscalls/unshare/.gitignore
> +++ b/testcases/kernel/syscalls/unshare/.gitignore
> @@ -2,3 +2,4 @@
>   /unshare02
>   /unshare03
>   /unshare04
> +/unshare05
> diff --git a/testcases/kernel/syscalls/unshare/unshare05.c b/testcases/kernel/syscalls/unshare/unshare05.c
> new file mode 100644
> index 000000000..59fc782ab
> --- /dev/null
> +++ b/testcases/kernel/syscalls/unshare/unshare05.c
> @@ -0,0 +1,47 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Copyright (c) 2025 lufei <lufei@uniontech.com>
> + */
> +
> +/*\
> + * This test case verifies unshare(CLONE_NEWPID) creates a new PID namespace
> + * and that the first child process in the new namespace gets PID 1.
> + */
> +
> +#define _GNU_SOURCE
> +
> +#include "tst_test.h"
> +#include "sched.h"
We have "lapi/sched.h"
> +
> +static struct tst_clone_args *args;
> +
> +static void setup(void)
> +{
> +	args->flags = CLONE_NEWPID;
> +	args->exit_signal = SIGCHLD;
> +}
> +
> +static void run(void)
> +{
> +	if (!SAFE_CLONE(args)) {
> +		SAFE_UNSHARE(CLONE_NEWPID);
> +
> +		if (!SAFE_FORK()) {
> +			TST_EXP_EQ_LI(getpid(), 1);
> +			exit(0);
> +		}
Here we need also exit(0);
> +	}
> +
> +	SAFE_WAIT(NULL);
This is not needed, LTP calls "tst_reap_children()" automatically.
> +}
> +
> +static struct tst_test test = {
> +	.setup = setup,
> +	.forks_child = 1,
> +	.needs_root = 1,
> +	.test_all = run,
> +	.bufs = (struct tst_buffers []) {
> +		{&args, .size = sizeof(*args)},
> +		{},
> +	}
> +};
- Andrea


More information about the ltp mailing list