Message ID | 20240115125351.7266-5-chrubis@suse.cz |
---|---|
State | Accepted |
Headers | show |
Series | Add tst_fd iterator API | expand |
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@suse.cz> > Reviewed-by: Richard Palethorpe <rpalethorpe@suse.com> > Reviewed-by: Petr Vorel <pvorel@suse.cz> Looks good to me. Feel free to add: Reviewed-by: Jan Kara <jack@suse.cz> 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@suse.cz> > + */ > + > +/*\ > + * [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 >
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@suse.cz> + */ + +/*\ + * [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, +};