From: Dmitry V. Levin Date: Sat, 27 May 2017 17:59:44 +0000 (+0000) Subject: tests: check termination signal forwarding X-Git-Tag: v4.18~156 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=ae1b07bc2a0a824b982cc52e0bcf9c9ba4e79411;p=strace tests: check termination signal forwarding * tests/run_expect_termsig.c: New file. * tests/unblock_reset_raise.c: Likewise. * tests/termsig.test: New test. * tests/.gitignore: Add run_expect_termsig and unblock_reset_raise. * tests/Makefile.am (check_PROGRAMS): Likewise. (MISC_TESTS): Add termsig.test. --- diff --git a/tests/.gitignore b/tests/.gitignore index 375179e7..3ecf7bda 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -282,6 +282,7 @@ rt_sigreturn rt_sigsuspend rt_sigtimedwait rt_tgsigqueueinfo +run_expect_termsig sched_get_priority_mxx sched_rr_get_interval sched_xetaffinity @@ -372,6 +373,7 @@ umovestr-illptr umovestr2 umovestr3 uname +unblock_reset_raise unix-pair-send-recv unix-pair-sendto-recvfrom unlink diff --git a/tests/Makefile.am b/tests/Makefile.am index 97503b24..60a51bab 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -119,6 +119,7 @@ check_PROGRAMS = $(PURE_EXECUTABLES) \ quotactl-xfs-v \ redirect-fds \ restart_syscall \ + run_expect_termsig \ scm_rights \ seccomp-filter-v \ seccomp-strict \ @@ -127,6 +128,7 @@ check_PROGRAMS = $(PURE_EXECUTABLES) \ sleep \ stack-fcall \ threads-execve \ + unblock_reset_raise \ unix-pair-send-recv \ unix-pair-sendto-recvfrom \ vfork-f \ @@ -268,6 +270,7 @@ MISC_TESTS = \ strace-t.test \ strace-tt.test \ strace-ttt.test \ + termsig.test \ threads-execve.test \ # end of MISC_TESTS diff --git a/tests/run_expect_termsig.c b/tests/run_expect_termsig.c new file mode 100644 index 00000000..de81ccb5 --- /dev/null +++ b/tests/run_expect_termsig.c @@ -0,0 +1,58 @@ +/* + * Execute a command, expect its termination with a specified signal. + * + * Copyright (c) 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 +#include + +int +main(int ac, char **av) +{ + if (ac < 3) + error_msg_and_fail("usage: run_expect_termsig signo path..."); + + signal(SIGCHLD, SIG_DFL); + + pid_t pid = fork(); + if (pid < 0) + perror_msg_and_fail("fork"); + + if (!pid) { + execvp(av[2], av + 2); + perror_msg_and_fail("execvp: %s", av[2]); + } + + int status; + if (waitpid(pid, &status, 0) != pid) + perror_msg_and_fail("waitpid"); + + return !(WIFSIGNALED(status) && WTERMSIG(status) == atoi(av[1])); +} diff --git a/tests/termsig.test b/tests/termsig.test new file mode 100755 index 00000000..fd8852ce --- /dev/null +++ b/tests/termsig.test @@ -0,0 +1,15 @@ +#!/bin/sh + +# Check termination signal forwarding. + +. "${srcdir=.}/init.sh" + +run_expect_termsig="../run_expect_termsig 15" +unblock_reset_raise="../unblock_reset_raise 15" + +run_prog $run_expect_termsig $unblock_reset_raise +STRACE="$run_expect_termsig $STRACE" + +for i in 1 2 3 4; do + run_strace -I$i -enone -esignal=none $unblock_reset_raise +done diff --git a/tests/unblock_reset_raise.c b/tests/unblock_reset_raise.c new file mode 100644 index 00000000..4182f129 --- /dev/null +++ b/tests/unblock_reset_raise.c @@ -0,0 +1,54 @@ +/* + * Unblock, reset, and raise a signal. + * + * Copyright (c) 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 + +int +main(int ac, char **av) +{ + if (ac != 2) + error_msg_and_fail("usage: unblock_raise signo"); + + sigset_t mask; + sigemptyset(&mask); + const int signo = atoi(av[1]); + if (sigaddset(&mask, signo)) + perror_msg_and_fail("sigaddset: %s", av[1]); + if (sigprocmask(SIG_UNBLOCK, &mask, NULL)) + perror_msg_and_fail("sigprocmask"); + if (signal(signo, SIG_DFL) == SIG_ERR) + perror_msg_and_fail("signal: %s", av[1]); + if (raise(signo)) + perror_msg_and_fail("raise: %s", av[1]); + + return 0; +}