From: Dmitry V. Levin Date: Sun, 12 Mar 2017 16:11:38 +0000 (+0000) Subject: tests: check decoding of rt_sigreturn syscall X-Git-Tag: v4.17~170 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=5c6951e73e017f558aae23c2fc6a5c1ee19fd295;p=strace tests: check decoding of rt_sigreturn syscall * tests/rt_sigreturn.c: New file. * tests/rt_sigreturn.test: New test. * tests/.gitignore: Add rt_sigreturn. * tests/Makefile.am (check_PROGRAMS): Likewise. (DECODER_TESTS): Add rt_sigreturn.test. --- diff --git a/tests/.gitignore b/tests/.gitignore index 6e44e5ca..a7754b6a 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -270,6 +270,7 @@ rmdir rt_sigpending rt_sigprocmask rt_sigqueueinfo +rt_sigreturn rt_sigsuspend rt_sigtimedwait rt_tgsigqueueinfo diff --git a/tests/Makefile.am b/tests/Makefile.am index 5a7a45f6..c5c124c0 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -331,6 +331,7 @@ check_PROGRAMS = \ rt_sigpending \ rt_sigprocmask \ rt_sigqueueinfo \ + rt_sigreturn \ rt_sigsuspend \ rt_sigtimedwait \ rt_tgsigqueueinfo \ @@ -727,6 +728,7 @@ DECODER_TESTS = \ rt_sigpending.test \ rt_sigprocmask.test \ rt_sigqueueinfo.test \ + rt_sigreturn.test \ rt_sigsuspend.test \ rt_sigtimedwait.test \ rt_tgsigqueueinfo.test \ diff --git a/tests/rt_sigreturn.c b/tests/rt_sigreturn.c new file mode 100644 index 00000000..40d15899 --- /dev/null +++ b/tests/rt_sigreturn.c @@ -0,0 +1,79 @@ +/* + * Copyright (c) 2015-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 +#include +#include + +#ifdef ASM_SIGRTMIN +# define RT_0 ASM_SIGRTMIN +#else +/* Linux kernel >= 3.18 defines SIGRTMIN to 32 on all architectures. */ +# define RT_0 32 +#endif + +static void +handler(int no, siginfo_t *si, void *uc) +{ +} + +int +main(void) +{ + static sigset_t set; + sigemptyset(&set); + sigaddset(&set, SIGINT); + sigaddset(&set, SIGUSR2); + sigaddset(&set, SIGCHLD); + sigaddset(&set, RT_0 + 3); + sigaddset(&set, RT_0 + 4); + sigaddset(&set, RT_0 + 5); + sigaddset(&set, RT_0 + 26); + sigaddset(&set, RT_0 + 27); + if (sigprocmask(SIG_SETMASK, &set, NULL)) + perror_msg_and_fail("sigprocmask"); + sigemptyset(&set); + + static const struct sigaction sa = { + .sa_sigaction = handler, + .sa_flags = SA_SIGINFO + }; + if (sigaction(SIGUSR1, &sa, NULL)) + perror_msg_and_fail("sigaction"); + + if (raise(SIGUSR1)) + perror_msg_and_fail("raise"); + + static const char *const sigs = + (SIGUSR2 < SIGCHLD) ? "INT USR2 CHLD" : "INT CHLD USR2"; + static const char *const rt_sigs = "RT_3 RT_4 RT_5 RT_26 RT_27"; + printf("rt_sigreturn({mask=[%s %s]}) = 0\n", sigs, rt_sigs); + + puts("+++ exited with 0 +++"); + return 0; +} diff --git a/tests/rt_sigreturn.test b/tests/rt_sigreturn.test new file mode 100755 index 00000000..6a77cd96 --- /dev/null +++ b/tests/rt_sigreturn.test @@ -0,0 +1,6 @@ +#!/bin/sh + +# Check decoding of rt_sigreturn syscall. +. "${srcdir=.}/init.sh" + +run_strace_match_diff -esignal='!USR1'