Message ID | 20240530082522.2505-1-maxj.fnst@fujitsu.com |
---|---|
State | Accepted |
Headers | show |
Series | [v2,1/2] signalfd01: Refactor old case with new API | expand |
Hi! Pushed with changes described below, thanks. - there is no need for three masks we just need one valid mask + moved the mask structure into a guarded buffer - it's pointless to attempt to close the fd_einval2 and fd_ebadf as these variables are never assigned a valid fd diff --git a/testcases/kernel/syscalls/signalfd/signalfd02.c b/testcases/kernel/syscalls/signalfd/signalfd02.c index 527e1aff9..fdd15781c 100644 --- a/testcases/kernel/syscalls/signalfd/signalfd02.c +++ b/testcases/kernel/syscalls/signalfd/signalfd02.c @@ -7,7 +7,7 @@ /*\ * [Description] * - * Verify that signalfd(2) fails with + * Verify that signalfd(2) fails with: * * - EBADF when fd is invalid * - EINVAL when fd is not a valid signalfd file descriptor @@ -23,53 +23,40 @@ static int fd_ebadf = -2; static int fd_einval1; static int fd_einval2 = -1; -static sigset_t mask1; -static sigset_t mask2; -static sigset_t mask3; +static sigset_t *mask; static struct test_case_t { int *fd; - sigset_t *mask; int flags; int expected_errno; char *desc; } tcases[] = { - {&fd_ebadf, &mask1, 0, EBADF, "fd is invalid"}, - {&fd_einval1, &mask2, 0, EINVAL, + {&fd_ebadf, 0, EBADF, "fd is invalid"}, + {&fd_einval1, 0, EINVAL, "fd is not a valid signalfd file descriptor"}, - {&fd_einval2, &mask3, -1, EINVAL, "flags are invalid"}, + {&fd_einval2, -1, EINVAL, "flags are invalid"}, }; static void setup(void) { - SAFE_SIGEMPTYSET(&mask1); - SAFE_SIGADDSET(&mask1, SIGUSR1); - SAFE_SIGPROCMASK(SIG_BLOCK, &mask1, NULL); - SAFE_SIGEMPTYSET(&mask2); - SAFE_SIGADDSET(&mask2, SIGUSR2); - SAFE_SIGPROCMASK(SIG_BLOCK, &mask2, NULL); - SAFE_SIGEMPTYSET(&mask2); - SAFE_SIGADDSET(&mask3, SIGUSR2); - SAFE_SIGPROCMASK(SIG_BLOCK, &mask3, NULL); + SAFE_SIGEMPTYSET(mask); + SAFE_SIGADDSET(mask, SIGUSR1); + SAFE_SIGPROCMASK(SIG_BLOCK, mask, NULL); fd_einval1 = SAFE_OPEN(SIGNAL_FILE, O_CREAT, 0777); } static void cleanup(void) { - if (fd_ebadf > 0) - SAFE_CLOSE(fd_ebadf); if (fd_einval1 > 0) SAFE_CLOSE(fd_einval1); - if (fd_einval2 > 0) - SAFE_CLOSE(fd_einval2); } static void verify_signalfd(unsigned int i) { struct test_case_t *tc = &tcases[i]; - TST_EXP_FAIL2(signalfd(*(tc->fd), tc->mask, tc->flags), + TST_EXP_FAIL2(signalfd(*(tc->fd), mask, tc->flags), tc->expected_errno, "%s", tc->desc); } @@ -79,4 +66,8 @@ static struct tst_test test = { .setup = setup, .cleanup = cleanup, .needs_tmpdir = 1, + .bufs = (struct tst_buffers []) { + {&mask, .size = sizeof(sigset_t)}, + {} + } };
diff --git a/runtest/syscalls b/runtest/syscalls index a06b046ac..2dac79798 100644 --- a/runtest/syscalls +++ b/runtest/syscalls @@ -1487,6 +1487,7 @@ signal05 signal05 signal06 signal06 signalfd01 signalfd01 +signalfd02 signalfd02 signalfd4_01 signalfd4_01 signalfd4_02 signalfd4_02 diff --git a/testcases/kernel/syscalls/signalfd/.gitignore b/testcases/kernel/syscalls/signalfd/.gitignore index 3c9ed737c..959022f41 100644 --- a/testcases/kernel/syscalls/signalfd/.gitignore +++ b/testcases/kernel/syscalls/signalfd/.gitignore @@ -1 +1,2 @@ /signalfd01 +/signalfd02 diff --git a/testcases/kernel/syscalls/signalfd/signalfd02.c b/testcases/kernel/syscalls/signalfd/signalfd02.c new file mode 100644 index 000000000..527e1aff9 --- /dev/null +++ b/testcases/kernel/syscalls/signalfd/signalfd02.c @@ -0,0 +1,82 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Copyright (c) 2024 FUJITSU LIMITED. All Rights Reserved. + * Author: Ma Xinjian <maxj.fnst@fujitsu.com> + */ + +/*\ + * [Description] + * + * Verify that signalfd(2) fails with + * + * - EBADF when fd is invalid + * - EINVAL when fd is not a valid signalfd file descriptor + * - EINVAL when flags are invalid + */ + +#include <sys/signalfd.h> +#include "tst_test.h" + +#define SIGNAL_FILE "signal_file" + +static int fd_ebadf = -2; +static int fd_einval1; +static int fd_einval2 = -1; + +static sigset_t mask1; +static sigset_t mask2; +static sigset_t mask3; + +static struct test_case_t { + int *fd; + sigset_t *mask; + int flags; + int expected_errno; + char *desc; +} tcases[] = { + {&fd_ebadf, &mask1, 0, EBADF, "fd is invalid"}, + {&fd_einval1, &mask2, 0, EINVAL, + "fd is not a valid signalfd file descriptor"}, + {&fd_einval2, &mask3, -1, EINVAL, "flags are invalid"}, +}; + +static void setup(void) +{ + SAFE_SIGEMPTYSET(&mask1); + SAFE_SIGADDSET(&mask1, SIGUSR1); + SAFE_SIGPROCMASK(SIG_BLOCK, &mask1, NULL); + SAFE_SIGEMPTYSET(&mask2); + SAFE_SIGADDSET(&mask2, SIGUSR2); + SAFE_SIGPROCMASK(SIG_BLOCK, &mask2, NULL); + SAFE_SIGEMPTYSET(&mask2); + SAFE_SIGADDSET(&mask3, SIGUSR2); + SAFE_SIGPROCMASK(SIG_BLOCK, &mask3, NULL); + + fd_einval1 = SAFE_OPEN(SIGNAL_FILE, O_CREAT, 0777); +} + +static void cleanup(void) +{ + if (fd_ebadf > 0) + SAFE_CLOSE(fd_ebadf); + if (fd_einval1 > 0) + SAFE_CLOSE(fd_einval1); + if (fd_einval2 > 0) + SAFE_CLOSE(fd_einval2); +} + +static void verify_signalfd(unsigned int i) +{ + struct test_case_t *tc = &tcases[i]; + + TST_EXP_FAIL2(signalfd(*(tc->fd), tc->mask, tc->flags), + tc->expected_errno, "%s", tc->desc); +} + +static struct tst_test test = { + .tcnt = ARRAY_SIZE(tcases), + .test = verify_signalfd, + .setup = setup, + .cleanup = cleanup, + .needs_tmpdir = 1, +};
Add negative cases for signalfd(), when errno is EBADF or EINVAL Signed-off-by: Ma Xinjian <maxj.fnst@fujitsu.com> --- runtest/syscalls | 1 + testcases/kernel/syscalls/signalfd/.gitignore | 1 + .../kernel/syscalls/signalfd/signalfd02.c | 82 +++++++++++++++++++ 3 files changed, 84 insertions(+) create mode 100644 testcases/kernel/syscalls/signalfd/signalfd02.c