[PATCH STAGING v2 05/16] fchroot02: test fchroot() invalid arguments
Andrea Cervesato <[email protected]>
| Newsgroups | gmane.linux.ltp |
|---|---|
| Message-ID | <[email protected]> |
From: Andrea Cervesato <andrea.cervesato-IBi9RG/[email protected]> Verify the fchroot() error paths: a non-zero flags argument fails with EINVAL before anything else, an invalid fd fails with EBADF, including the FD_PIDFS_ROOT and FD_NSFS_ROOT sentinels, and a fd referring to a regular file fails with ENOTDIR. All these checks happen before the CAP_SYS_CHROOT check, so no privileges are needed. Signed-off-by: Andrea Cervesato <andrea.cervesato-IBi9RG/[email protected]> --- runtest/staging | 1 + testcases/kernel/syscalls/fchroot/.gitignore | 1 + testcases/kernel/syscalls/fchroot/fchroot02.c | 80 +++++++++++++++++++++++++++ 3 files changed, 82 insertions(+) diff --git a/runtest/staging b/runtest/staging index 733d5609a..e12230218 100644 --- a/runtest/staging +++ b/runtest/staging @@ -1,3 +1,4 @@ # Tests for features that are not yet in the stable kernel ABI fchroot01 fchroot01 +fchroot02 fchroot02 diff --git a/testcases/kernel/syscalls/fchroot/.gitignore b/testcases/kernel/syscalls/fchroot/.gitignore index 03ebdbe7a..fb3287612 100644 --- a/testcases/kernel/syscalls/fchroot/.gitignore +++ b/testcases/kernel/syscalls/fchroot/.gitignore @@ -1 +1,2 @@ fchroot01 +fchroot02 diff --git a/testcases/kernel/syscalls/fchroot/fchroot02.c b/testcases/kernel/syscalls/fchroot/fchroot02.c new file mode 100644 index 000000000..96be00d70 --- /dev/null +++ b/testcases/kernel/syscalls/fchroot/fchroot02.c @@ -0,0 +1,80 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (C) 2026 SUSE LLC Andrea Cervesato <andrea.cervesato-IBi9RG/[email protected]> + */ + +/*\ + * Test the :manpage:`fchroot(2)` error paths for invalid arguments. + * + * :manpage:`fchroot(2)` was introduced in Linux v7.3. The syscall checks its + * arguments in this order: + * + * - a non-zero flags argument fails with ``EINVAL`` before anything else, + * including with the ``FD_FAILFS_ROOT`` sentinel and with an invalid fd + * - an invalid fd fails with ``EBADF``, including the ``FD_PIDFS_ROOT`` and + * ``FD_NSFS_ROOT`` sentinels which :manpage:`fchroot(2)` does not accept + * - a fd referring to a regular file fails with ``ENOTDIR`` + * + * All these checks happen before the ``CAP_SYS_CHROOT`` check, so the test + * needs no privileges. + */ + +#include <fcntl.h> +#include "tst_test.h" +#include "lapi/fcntl.h" +#include "lapi/syscalls.h" + +#define FILENAME "file.txt" + +static int dir_fd = -1; +static int file_fd = -1; +static int bad_fd = -1; +static int failfs_root = FD_FAILFS_ROOT; +static int pidfs_root = FD_PIDFS_ROOT; +static int nsfs_root = FD_NSFS_ROOT; + +static struct tcase { + int *fd; + unsigned int flags; + int exp_errno; + const char *desc; +} tcases[] = { + {&dir_fd, 1, EINVAL, "non-zero flags with a directory fd"}, + {&failfs_root, 1, EINVAL, "non-zero flags with FD_FAILFS_ROOT"}, + {&bad_fd, 1, EINVAL, "non-zero flags with an invalid fd"}, + {&bad_fd, 0, EBADF, "invalid fd"}, + {&pidfs_root, 0, EBADF, "FD_PIDFS_ROOT sentinel"}, + {&nsfs_root, 0, EBADF, "FD_NSFS_ROOT sentinel"}, + {&file_fd, 0, ENOTDIR, "fd referring to a regular file"}, +}; + +static void run(unsigned int i) +{ + struct tcase *tc = &tcases[i]; + + TST_EXP_FAIL(tst_syscall(__NR_fchroot, *tc->fd, tc->flags), + tc->exp_errno, "fchroot() with %s", tc->desc); +} + +static void setup(void) +{ + dir_fd = SAFE_OPEN(".", O_PATH | O_DIRECTORY); + file_fd = SAFE_OPEN(FILENAME, O_CREAT | O_EXCL | O_WRONLY, 0644); +} + +static void cleanup(void) +{ + if (dir_fd != -1) + SAFE_CLOSE(dir_fd); + + if (file_fd != -1) + SAFE_CLOSE(file_fd); +} + +static struct tst_test test = { + .test = run, + .tcnt = ARRAY_SIZE(tcases), + .setup = setup, + .cleanup = cleanup, + .needs_tmpdir = 1, +}; -- 2.51.0 -- Mailing list info: https://lists.linux.it/listinfo/ltp