[LTP] [PATCH] listmount04: Detect EBADF behavior dynamically at runtime
Petr Vorel
pvorel@suse.cz
Fri Jul 24 14:11:14 CEST 2026
> Upstream commit 78f0e33cd6c9 ("fs/namespace: correctly handle errors
> returned by grab_requested_mnt_ns") changed the errno from EINVAL to
> EBADF when an invalid mount namespace file descriptor is passed to
> listmount(). This change has been backported to various stable kernels
> (e.g., 6.12.59 LTS).
> Instead of hardcoding version checks for every stable backport, probe
> the behavior dynamically in setup() by calling listmount() with an
> invalid fd (-1) and checking the returned errno.
> Signed-off-by: Wake Liu <wakel@google.com>
> ---
> .../kernel/syscalls/listmount/listmount04.c | 27 ++++++++++++++++---
> 1 file changed, 23 insertions(+), 4 deletions(-)
> diff --git a/testcases/kernel/syscalls/listmount/listmount04.c b/testcases/kernel/syscalls/listmount/listmount04.c
> index 919f4c854..f7343608f 100644
> --- a/testcases/kernel/syscalls/listmount/listmount04.c
> +++ b/testcases/kernel/syscalls/listmount/listmount04.c
> @@ -153,16 +153,35 @@ static void run(unsigned int n)
> }
> TST_EXP_FAIL(tst_syscall(__NR_listmount, req, tc->mnt_ids,
> - tc->nr_mnt_ids, tc->flags), tc->exp_errno,
> - "%s", tc->msg);
> + tc->nr_mnt_ids, tc->flags),
> + tc->exp_errno,
> + "%s", tc->msg);
> }
> static void setup(void)
> {
> - if (tst_kvercmp(6, 17, 9) >= 0)
> + mnt_id_req req = {
> + .size = MNT_ID_REQ_SIZE_VER0,
> + .mnt_id = LSMT_ROOT,
> + .mnt_ns_fd = -1,
> + };
> + uint64_t ids[MNT_SIZE];
> +
> + TEST(tst_syscall(__NR_listmount, &req, ids, MNT_SIZE, 0));
I wonder if we should use listmount() from listmount.h.
> + if (TST_RET >= 0)
> + tst_brk(TBROK, "listmount() succeeded unexpectedly with invalid fd");
Maybe we could have TST_EXP_FAIL_ARR_SILENT_BRK() in the future :)
> +
> + if (TST_ERR == EBADF) {
> kver = AFTER_6_17_9;
At this point we may rename macros back to AFTER_6_18 and BEFORE_6_18, with
keeping note that it got backported into stable.
> - else
> + tst_res(TINFO, "Detected kernel with EBADF behavior for invalid mnt_ns_fd");
> + } else if (TST_ERR == EINVAL) {
> kver = BEFORE_6_17_9;
> + tst_res(TINFO, "Detected kernel with EINVAL behavior for invalid mnt_ns_fd");
> + } else if (TST_ERR == ENOSYS) {
> + tst_brk(TCONF, "listmount() syscall not supported");
This is IMHO not supported, because it's part of tst_syscall().
Other than this LGTM.
Reviewed-by: Petr Vorel <pvorel@suse.cz>
Kind regards,
Petr
> + } else {
> + tst_brk(TBROK | TTERRNO, "Unexpected error during probe");
> + }
More information about the ltp
mailing list