diff --git a/testcases/kernel/syscalls/ioctl/.gitignore b/testcases/kernel/syscalls/ioctl/.gitignore index 9f995b1ad74..1f099ff9514 100644 --- a/testcases/kernel/syscalls/ioctl/.gitignore +++ b/testcases/kernel/syscalls/ioctl/.gitignore @@ -25,5 +25,6 @@ /ioctl_ficlone01 /ioctl_ficlone02 /ioctl_ficlone03 +/ioctl_ficlone04 /ioctl_ficlonerange01 /ioctl_ficlonerange02 diff --git a/testcases/kernel/syscalls/ioctl/ioctl_ficlone04.c b/testcases/kernel/syscalls/ioctl/ioctl_ficlone04.c new file mode 100644 index 00000000000..1dcf4f05c15 --- /dev/null +++ b/testcases/kernel/syscalls/ioctl/ioctl_ficlone04.c @@ -0,0 +1,52 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (C) 2024 Andrea Cervesato + */ + +/*\ + * [Description] + * + * This test verifies that ioctl() FICLONE/FICLONERANGE feature raises the right + * error according with bad file descriptors. + */ + +#include "tst_test.h" +#include "lapi/ficlone.h" + +static void test_bad_fd(struct tst_fd *fd_src, struct tst_fd *fd_dst) +{ + if (fd_src->type == TST_FD_FILE && fd_src->type == fd_dst->type) { + tst_res(TINFO, "Skipping file: SUCCESS"); + return; + } + + int exp_errnos[] = { + EOPNOTSUPP, + EPERM, + EISDIR, + EBADF, + EINVAL, + EXDEV, + }; + + TST_EXP_FAIL2_ARR(ioctl(fd_dst->fd, FICLONE, fd_src->fd), + exp_errnos, ARRAY_SIZE(exp_errnos), + "ioctl(%s, FICLONE, %s)", + tst_fd_desc(fd_src), + tst_fd_desc(fd_dst)); +} + +static void run(void) +{ + TST_FD_FOREACH(fd_src) { + TST_FD_FOREACH(fd_dst) + test_bad_fd(&fd_src, &fd_dst); + } +} + +static struct tst_test test = { + .test_all = run, + .min_kver = "4.5", + .needs_root = 1, + .needs_tmpdir = 1, +};