From: Dmitry V. Levin Date: Sun, 28 May 2017 00:09:52 +0000 (+0000) Subject: tests: check decoding of sigpending syscall X-Git-Tag: v4.18~152 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=221da524adb5f8b1c590d39343795ae0e82fabff;p=strace tests: check decoding of sigpending syscall * tests/sigpending.c: New file. * tests/gen_tests.in (sigpending): New entry. * tests/pure_executables.list: Add sigpending. * tests/.gitignore: Likewise. --- diff --git a/tests/.gitignore b/tests/.gitignore index 3bdc8f4c..2b88b27e 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -331,6 +331,7 @@ siginfo signal signal_receive signalfd4 +sigpending sigprocmask sigreturn sigsuspend diff --git a/tests/gen_tests.in b/tests/gen_tests.in index 0c74f33d..89f7737f 100644 --- a/tests/gen_tests.in +++ b/tests/gen_tests.in @@ -284,6 +284,7 @@ siginfo -e trace=none signal -a25 -e signal=none -e trace='/^signal$' signal_receive -a16 -e trace=kill signalfd4 +sigpending -a15 sigprocmask -a34 sigreturn -esignal='!USR1' sigsuspend -a19 -esignal=none diff --git a/tests/pure_executables.list b/tests/pure_executables.list index 4486052c..b4df4ba2 100755 --- a/tests/pure_executables.list +++ b/tests/pure_executables.list @@ -271,6 +271,7 @@ sigaltstack siginfo signal signalfd4 +sigpending sigprocmask sigreturn sigsuspend diff --git a/tests/sigpending.c b/tests/sigpending.c new file mode 100644 index 00000000..0ce4b219 --- /dev/null +++ b/tests/sigpending.c @@ -0,0 +1,106 @@ +/* + * Check decoding of sigpending syscall. + * + * Copyright (c) 2016-2017 Dmitry V. Levin + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. The name of the author may not be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#include "tests.h" +#include + +#ifdef __NR_sigpending + +# include +# include +# include +# include +# include + +static const char *errstr; + +static long +k_sigpending(const kernel_ulong_t set) +{ + const long rc = syscall(__NR_sigpending, set); + errstr = sprintrc(rc); + return rc; +} + +int +main(void) +{ + TAIL_ALLOC_OBJECT_CONST_PTR(kernel_ulong_t, k_set); + TAIL_ALLOC_OBJECT_CONST_PTR(sigset_t, libc_set); + + sigemptyset(libc_set); + if (sigprocmask(SIG_SETMASK, libc_set, NULL)) + perror_msg_and_fail("sigprocmask"); + + if (k_sigpending((uintptr_t) libc_set)) + perror_msg_and_skip("sigpending"); + else + puts("sigpending([]) = 0"); + + k_sigpending((uintptr_t) k_set); + puts("sigpending([]) = 0"); + + k_sigpending((uintptr_t) (k_set + 1)); + printf("sigpending(%p) = -1 EFAULT (%m)\n", k_set + 1); + + uintptr_t efault = sizeof(*k_set) / 2 + (uintptr_t) k_set; + k_sigpending(efault); + printf("sigpending(%#jx) = -1 EFAULT (%m)\n", (uintmax_t) efault); + + sigaddset(libc_set, SIGHUP); + if (sigprocmask(SIG_SETMASK, libc_set, NULL)) + perror_msg_and_fail("sigprocmask"); + raise(SIGHUP); + + k_sigpending((uintptr_t) k_set); + puts("sigpending([HUP]) = 0"); + + sigaddset(libc_set, SIGINT); + if (sigprocmask(SIG_SETMASK, libc_set, NULL)) + perror_msg_and_fail("sigprocmask"); + raise(SIGINT); + + k_sigpending((uintptr_t) k_set); + puts("sigpending([HUP INT]) = 0"); + + if (F8ILL_KULONG_SUPPORTED) { + k_sigpending(f8ill_ptr_to_kulong(k_set)); + printf("sigpending(%#jx) = %s\n", + (uintmax_t) f8ill_ptr_to_kulong(k_set), errstr); + } + + puts("+++ exited with 0 +++"); + return 0; +} + +#else + +SKIP_MAIN_UNDEFINED("__NR_sigpending") + +#endif