[LTP] [PATCH STAGING 11/16] fchroot08: test failfs root fork inheritance
Andrea Cervesato <[email protected]>
| Newsgroups | it.linux.lists.ltp |
|---|---|
| Message-ID | <[email protected]> |
From: Andrea Cervesato <[email protected]> Verify that the root moved into failfs by fchroot() lives in the fs_struct which is duplicated on fork, so a child of a process with the failfs root also fails every absolute path lookup with EOPNOTSUPP. Signed-off-by: Andrea Cervesato <[email protected]> --- runtest/staging | 1 + testcases/kernel/syscalls/fchroot/.gitignore | 1 + testcases/kernel/syscalls/fchroot/fchroot08.c | 52 +++++++++++++++++++++++++++ 3 files changed, 54 insertions(+) diff --git a/runtest/staging b/runtest/staging index b8954bb5a..8dfe95c4a 100644 --- a/runtest/staging +++ b/runtest/staging @@ -7,3 +7,4 @@ fchroot04 fchroot04 fchroot05 fchroot05 fchroot06 fchroot06 fchroot07 fchroot07 +fchroot08 fchroot08 diff --git a/testcases/kernel/syscalls/fchroot/.gitignore b/testcases/kernel/syscalls/fchroot/.gitignore index b68069d9a..c099b4b3a 100644 --- a/testcases/kernel/syscalls/fchroot/.gitignore +++ b/testcases/kernel/syscalls/fchroot/.gitignore @@ -5,3 +5,4 @@ fchroot04 fchroot05 fchroot06 fchroot07 +fchroot08 diff --git a/testcases/kernel/syscalls/fchroot/fchroot08.c b/testcases/kernel/syscalls/fchroot/fchroot08.c new file mode 100644 index 000000000..4593a24d3 --- /dev/null +++ b/testcases/kernel/syscalls/fchroot/fchroot08.c @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (C) 2026 SUSE LLC Andrea Cervesato <[email protected]> + */ + +/*\ + * Test that the failfs root is inherited across :manpage:`fork(2)`. + * + * The root moved into failfs by :manpage:`fchroot(2)` lives in the + * fs_struct which is duplicated on fork, so a child of a process with the + * failfs root also fails every absolute path lookup with EOPNOTSUPP. + * + * Root is required because entering failfs with the FD_FAILFS_ROOT + * sentinel requires CAP_SYS_CHROOT. + * + * The test runs in a forked child so the root of the parent process is + * left untouched. + */ + +#define _GNU_SOURCE +#include <fcntl.h> +#include <sys/wait.h> +#include "tst_test.h" +#include "lapi/fcntl.h" +#include "lapi/syscalls.h" + +static void run(void) +{ + if (!SAFE_FORK()) { + pid_t pid; + + TST_EXP_PASS(tst_syscall(__NR_fchroot, FD_FAILFS_ROOT, 0), + "fchroot() with the FD_FAILFS_ROOT sentinel"); + + pid = SAFE_FORK(); + if (!pid) { + TST_EXP_FAIL2(open("/etc", O_PATH), EOPNOTSUPP, + "absolute lookup in a forked child"); + exit(0); + } + + SAFE_WAITPID(pid, NULL, 0); + + exit(0); + } +} + +static struct tst_test test = { + .test_all = run, + .needs_root = 1, + .forks_child = 1, +}; -- 2.51.0 -- Mailing list info: https://lists.linux.it/listinfo/ltp