[LTP] [PATCH v2 2/2] sigpending/rt_sigpending: add basic test
Steve Muckle
smuckle@google.com
Tue Mar 19 01:04:29 CET 2019
Hi Matthias I had a couple minor comments,
On 03/13/2019 05:02 AM, 'Matthias Maennich' via kernel-team wrote:
> Test basic functionality of sigpending/rt_sigpending.
>
> Signed-off-by: Matthias Maennich <maennich@google.com>
> ---
> .../kernel/syscalls/sigpending/sigpending02.c | 112 ++++++++++++++++--
> 1 file changed, 102 insertions(+), 10 deletions(-)
>
> diff --git a/testcases/kernel/syscalls/sigpending/sigpending02.c b/testcases/kernel/syscalls/sigpending/sigpending02.c
> index cc50870b107a..e75c6aa69c4c 100644
> --- a/testcases/kernel/syscalls/sigpending/sigpending02.c
> +++ b/testcases/kernel/syscalls/sigpending/sigpending02.c
> @@ -4,14 +4,18 @@
> *
> * AUTHORS
> * Paul Larson
> + * Matthias Maennich
> *
> * DESCRIPTION
> - * Test to see that the proper errors are returned by sigpending. All the
> - * tests can also be compiled to use the rt_sigpending syscall instead. To
> - * simplify the documentation, only sigpending() is usually mentioned
> - * below.
> + * Test to assert basic functionality of sigpending. All the tests can also be
> + * compiled to use the rt_sigpending syscall instead. To simplify the
> + * documentation, only sigpending() is usually mentioned below.
> *
> * Test 1:
> + * Suppress handling SIGUSR1 and SIGUSR1, raise them and assert their
> + * signal pending.
> + *
> + * Test 2:
> * Call sigpending(sigset_t*=-1), it should return -1 with errno EFAULT
> */
>
> @@ -23,19 +27,101 @@
> #include "ltp_signal.h"
> #include "lapi/syscalls.h"
>
> -static void run(void)
> -{
> - /* set sigset to point to an invalid location */
> - sigset_t *sigset = (sigset_t *) - 1;
> +#define min(x, y) (((x) < (y)) ? (x) : (y))
>
> #if defined(TEST_SIGPENDING)
> - TEST(tst_syscall(__NR_sigpending, sigset));
> +#define tested_sigpending(sigset) TEST(tst_syscall(__NR_sigpending, sigset))
> #elif defined(TEST_RT_SIGPENDING)
> - TEST(tst_syscall(__NR_rt_sigpending, sigset, SIGSETSIZE));
> +#define tested_sigpending(sigset) \
> + TEST(tst_syscall(__NR_rt_sigpending, sigset, SIGSETSIZE))
> #else
> #error Neither TEST_SIGPENDING nor TEST_RT_SIGPENDING is defined!
> #endif
>
> +static int sighandler_counter = 0;
> +static void sighandler(int signum)
> +{
> + (void)signum;
You can use LTP_ATTRIBUTE_UNUSED on signum to avoid the above statement
> + ++sighandler_counter;
> +}
> +
> +static void test_sigpending(void)
> +{
> + int SIGMAX = min(sizeof(sigset_t) * 8, _NSIG);
> +
> + // set up signal mask and handler
AFAIK /* */ comments are preferred in new LTP commits.
> + sigset_t only_SIGUSR, old_mask;
> + sighandler_t old_sighandler1, old_sighandler2;
> + sigemptyset(&only_SIGUSR);
> + sigaddset(&only_SIGUSR, SIGUSR1);
> + sigaddset(&only_SIGUSR, SIGUSR2);
> + if (sigprocmask(SIG_SETMASK, &only_SIGUSR, &old_mask))
> + tst_brk(TBROK, "sigprocmask failed");
> + old_sighandler1 = SAFE_SIGNAL(SIGUSR1, sighandler);
> + old_sighandler2 = SAFE_SIGNAL(SIGUSR2, sighandler);
> +
> + // Initially no signal should be pending
> + sigset_t pending;
> + sigemptyset(&pending);
> + tested_sigpending(&pending);
> +
> + for (int i = 1; i < SIGMAX; ++i)
> + if (sigismember(&pending, i))
> + tst_brk(TFAIL,
> + "initialization failed: no signal should be pending by now");
> +
> + // raise a signal
> + if (raise(SIGUSR1))
> + tst_brk(TBROK, "raising SIGUSR1 failed");
> + if (sighandler_counter > 0)
> + tst_brk(TFAIL,
> + "signal handler is not (yet) supposed to be called");
> +
> + // now we should have exactly one pending signal (SIGUSR1)
> + sigemptyset(&pending);
> + tested_sigpending(&pending);
> + for (int i = 1; i < SIGMAX; ++i)
> + if ((i == SIGUSR1) != sigismember(&pending, i))
> + tst_brk(TFAIL, "only SIGUSR1 should be pending by now");
> +
> + // raise another signal
> + if (raise(SIGUSR2))
> + tst_brk(TBROK, "raising SIGUSR2 failed");
> + if (sighandler_counter > 0)
> + tst_brk(TFAIL,
> + "signal handler is not (yet) supposed to be called");
> +
> + // now we should have exactly two pending signals (SIGUSR1, SIGUSR2)
> + sigemptyset(&pending);
> + tested_sigpending(&pending);
> + for (int i = 1; i < SIGMAX; ++i)
> + if ((i == SIGUSR1 || i == SIGUSR2) != sigismember(&pending, i))
> + tst_brk(TFAIL,
> + "only SIGUSR1, SIGUSR2 should be pending by now");
> +
> + tst_res(TPASS, "basic sigpending test successful");
> +
> + // reinstate old mask
> + if (sigprocmask(SIG_SETMASK, &old_mask, NULL))
> + tst_brk(TBROK, "sigprocmask failed");
> +
> + // at this time the signal handler has been called, once for each signal
> + if (sighandler_counter != 2)
> + tst_brk(TFAIL,
> + "signal handler has not been called for each signal");
> +
> + // reinstate the original signal handlers
> + SAFE_SIGNAL(SIGUSR1, old_sighandler1);
> + SAFE_SIGNAL(SIGUSR2, old_sighandler2);
> +}
> +
> +static void test_efault_on_invalid_sigset(void)
> +{
> + /* set sigset to point to an invalid location */
> + sigset_t *sigset = (sigset_t *)-1;
> +
> + tested_sigpending(sigset);
> +
> /* check return code */
> if (TST_RET == -1) {
> if (TST_ERR != EFAULT) {
> @@ -51,6 +137,12 @@ static void run(void)
> }
> }
>
> +static void run(void)
> +{
> + test_sigpending();
> + test_efault_on_invalid_sigset();
> +}
> +
> static struct tst_test test = {
> .test_all = run
> };
>
More information about the ltp
mailing list