On Mon 15-01-24 13:53:51, Cyril Hrubis wrote: > We loop over all possible combinations of file descriptors in the test > and filter out combinations that actually make sense and either block or > attempt to copy data. > > The rest of invalid options produce either EINVAL or EBADF. > > Signed-off-by: Cyril Hrubis <chrubis@xxxxxxx> > Reviewed-by: Richard Palethorpe <rpalethorpe@xxxxxxxx> > Reviewed-by: Petr Vorel <pvorel@xxxxxxx> Looks good to me. Feel free to add: Reviewed-by: Jan Kara <jack@xxxxxxx> Honza > --- > runtest/syscalls | 1 + > testcases/kernel/syscalls/splice/.gitignore | 1 + > testcases/kernel/syscalls/splice/splice07.c | 70 +++++++++++++++++++++ > 3 files changed, 72 insertions(+) > create mode 100644 testcases/kernel/syscalls/splice/splice07.c > > diff --git a/runtest/syscalls b/runtest/syscalls > index 5472c954b..6e2407879 100644 > --- a/runtest/syscalls > +++ b/runtest/syscalls > @@ -1516,6 +1516,7 @@ splice03 splice03 > splice04 splice04 > splice05 splice05 > splice06 splice06 > +splice07 splice07 > > tee01 tee01 > tee02 tee02 > diff --git a/testcases/kernel/syscalls/splice/.gitignore b/testcases/kernel/syscalls/splice/.gitignore > index 61e979ad6..88a8dff78 100644 > --- a/testcases/kernel/syscalls/splice/.gitignore > +++ b/testcases/kernel/syscalls/splice/.gitignore > @@ -4,3 +4,4 @@ > /splice04 > /splice05 > /splice06 > +/splice07 > diff --git a/testcases/kernel/syscalls/splice/splice07.c b/testcases/kernel/syscalls/splice/splice07.c > new file mode 100644 > index 000000000..135c42e47 > --- /dev/null > +++ b/testcases/kernel/syscalls/splice/splice07.c > @@ -0,0 +1,70 @@ > +// SPDX-License-Identifier: GPL-2.0-or-later > + > +/* > + * Copyright (C) 2023-2024 Cyril Hrubis <chrubis@xxxxxxx> > + */ > + > +/*\ > + * [Description] > + * > + * Iterate over all kinds of file descriptors and feed splice() with all possible > + * combinations where at least one file descriptor is invalid. We do expect the > + * syscall to fail either with EINVAL or EBADF. > + */ > + > +#define _GNU_SOURCE > + > +#include <sys/socket.h> > +#include <netinet/in.h> > + > +#include "tst_test.h" > + > +static void check_splice(struct tst_fd *fd_in, struct tst_fd *fd_out) > +{ > + /* These combinations just hang since the pipe is empty */ > + if (fd_in->type == TST_FD_PIPE_READ) { > + switch (fd_out->type) { > + case TST_FD_FILE: > + case TST_FD_PIPE_WRITE: > + case TST_FD_UNIX_SOCK: > + case TST_FD_INET_SOCK: > + case TST_FD_MEMFD: > + return; > + default: > + break; > + } > + } > + > + if (fd_out->type == TST_FD_PIPE_WRITE) { > + switch (fd_in->type) { > + /* While these combinations succeeed */ > + case TST_FD_FILE: > + case TST_FD_MEMFD: > + return; > + /* And this complains about socket not being connected */ > + case TST_FD_INET_SOCK: > + return; > + default: > + break; > + } > + } > + > + const int exp_errnos[] = {EBADF, EINVAL}; > + > + TST_EXP_FAIL2_ARR(splice(fd_in->fd, NULL, fd_out->fd, NULL, 1, 0), > + exp_errnos, "splice() on %s -> %s", > + tst_fd_desc(fd_in), tst_fd_desc(fd_out)); > +} > + > +static void verify_splice(void) > +{ > + TST_FD_FOREACH(fd_in) { > + tst_res(TINFO, "%s -> ...", tst_fd_desc(&fd_in)); > + TST_FD_FOREACH(fd_out) > + check_splice(&fd_in, &fd_out); > + } > +} > + > +static struct tst_test test = { > + .test_all = verify_splice, > +}; > -- > 2.43.0 > -- Jan Kara <jack@xxxxxxxx> SUSE Labs, CR