[LTP] [PATCH STAGING v2 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 | 69 +++++++++++++++++++++++++++ 3 files changed, 71 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..3efe8d85f --- /dev/null +++ b/testcases/kernel/syscalls/fchroot/fchroot08.c @@ -0,0 +1,69 @@ +// 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" + +#define ABSDIR "abs" + +static void run(void) +{ + if (SAFE_FORK()) + return; + + 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(ABSDIR, O_PATH), EOPNOTSUPP, + "absolute lookup in a forked child"); + exit(0); + } + + SAFE_WAITPID(pid, NULL, 0); + + exit(0); +} + +static void setup(void) +{ + char *tmpdir; + char abs_path[PATH_MAX]; + + tmpdir = tst_tmpdir_path(); + snprintf(abs_path, sizeof(abs_path), "%s/%s", tmpdir, "target"); + + SAFE_TOUCH("target", 0644, NULL); + SAFE_SYMLINK(abs_path, ABSDIR); +} + +static struct tst_test test = { + .test_all = run, + .setup = setup, + .needs_root = 1, + .forks_child = 1, + .needs_tmpdir = 1, +}; -- 2.51.0 -- Mailing list info: https://lists.linux.it/listinfo/ltp