From: Dmitry V. Levin Date: Fri, 18 Nov 2016 00:11:27 +0000 (+0000) Subject: tests: check -e signal=set syntax X-Git-Tag: v4.15~122 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=8f73dc556e7a106e819e3acddd2778de7f7e7e4e;p=strace tests: check -e signal=set syntax * tests/qual_signal.c: New file. * tests/qual_signal.test: New test. * tests/.gitignore: Add qual_signal. * tests/Makefile.am (check_PROGRAMS): Likewise. (MISC_TESTS): Add qual_signal.test. --- diff --git a/tests/.gitignore b/tests/.gitignore index 6fc3cd1f..027bdc4b 100644 --- a/tests/.gitignore +++ b/tests/.gitignore @@ -197,8 +197,8 @@ open openat pause pc -perf_event_open_nonverbose perf_event_open +perf_event_open_nonverbose perf_event_open_unabbrev personality pipe @@ -219,6 +219,7 @@ process_vm_writev pselect6 ptrace pwritev +qual_signal quotactl quotactl-v quotactl-xfs diff --git a/tests/Makefile.am b/tests/Makefile.am index df5ddb21..05844541 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -277,6 +277,7 @@ check_PROGRAMS = \ pselect6 \ ptrace \ pwritev \ + qual_signal \ quotactl \ quotactl-v \ quotactl-xfs \ @@ -793,6 +794,7 @@ MISC_TESTS = \ ksysent.test \ opipe.test \ pc.test \ + qual_signal.test \ qual_syscall.test \ redirect.test \ redirect-fds.test \ diff --git a/tests/qual_signal.c b/tests/qual_signal.c new file mode 100644 index 00000000..106dabea --- /dev/null +++ b/tests/qual_signal.c @@ -0,0 +1,82 @@ +/* + * Check how strace -e signal=set works. + * + * Copyright (c) 2016 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 +#include + +static pid_t pid; +static uid_t uid; + +static void +handler(int sig) +{ +} + +static void +test_sig(int signo, const char *name) +{ + const struct sigaction act = { .sa_handler = handler }; + + if (sigaction(signo, &act, NULL)) + perror_msg_and_fail("sigaction: %d", signo); + + sigset_t mask; + sigemptyset(&mask); + sigaddset(&mask, signo); + if (sigprocmask(SIG_UNBLOCK, &mask, NULL)) + perror_msg_and_fail("sigprocmask: %d", signo); + + if (kill(pid, signo)) + perror_msg_and_fail("kill(%d, %d)", pid, signo); + + if (name && *name) + printf("--- %s {si_signo=%s, si_code=SI_USER" + ", si_pid=%d, si_uid=%d} ---\n", + name, name, pid, uid); +} + +int +main(int ac, const char **av) +{ + assert(ac & 1); + + pid = getpid(); + uid = geteuid(); + + int i; + for (i = 1; i < ac; i += 2) + test_sig(atoi(av[i]), av[i + 1]); + + puts("+++ exited with 0 +++"); + return 0; +} diff --git a/tests/qual_signal.test b/tests/qual_signal.test new file mode 100755 index 00000000..b1702c07 --- /dev/null +++ b/tests/qual_signal.test @@ -0,0 +1,106 @@ +#!/bin/sh +# +# Check how strace -e signal=set works. +# +# Copyright (c) 2016 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. + +. "${srcdir=.}/init.sh" + +test_one_sig() +{ + local sigs + sigs="$1"; shift + + run_prog "./$NAME" "$@" > /dev/null + run_strace -e trace=none -e signal="$sigs" "./$NAME" "$@" > "$EXP" + match_diff "$LOG" "$EXP" + rm -f "$EXP" +} + +test_sigs() +{ + local first second sigs + first="$1"; shift + second="$1"; shift + + for sigs; do + test_one_sig "$sigs" 2 "$first" 15 "$second" + done +} + +test_sigs '' '' \ + none '!all' \ + CHLD SIGCHLD ALRM SIGALRM \ + CHLD,SIGALRM ALRM,SIGCHLD \ + 9 9,4 9,4,11 \ + 4,CHLD,11,ALRM,9 \ + '!2,15' '!INT,TERM' '!SIGINT,TERM' '!INT,SIGTERM' '!SIGTERM,SIGINT' \ + '!2,INT,TERM' '!2,SIGTERM' '!SIGINT,15' '!INT,SIGTERM,15' \ + '!2,4,15' '!15,9,2,11,4' + +test_sigs SIGINT '' \ + 2 INT SIGINT \ + CHLD,SIGINT SIGINT,SIGALRM \ + ALRM,2,SIGCHLD \ + '!15' '!TERM' '!SIGTERM' \ + '!15,TERM' '!SIGTERM,15,TERM' \ + '!SIGALRM,TERM' '!CHLD,SIGTERM' \ + '!ALRM,15' '!SIGCHLD,ALRM,SIGTERM,KILL' \ + '!4,15' '!15,9,11,4' + +test_sigs '' SIGTERM \ + 15 TERM SIGTERM \ + CHLD,SIGTERM SIGTERM,SIGALRM \ + ALRM,15,SIGCHLD \ + '!2' '!INT' '!SIGINT' \ + '!2,INT' '!SIGINT,2,INT' \ + '!SIGALRM,INT' '!CHLD,SIGINT' \ + '!ALRM,2' '!SIGCHLD,ALRM,SIGINT,KILL' \ + '!4,2' '!2,9,11,4' + +test_sigs SIGINT SIGTERM \ + all '!none' \ + INT,TERM SIGINT,TERM SIGTERM,INT SIGINT,SIGTERM \ + 2,15 2,TERM SIGTERM,2 TERM,15,SIGINT,2 \ + '!CHLD' '!SIGCHLD' '!ALRM' '!SIGALRM' \ + '!CHLD,SIGALRM' '!ALRM,SIGCHLD' \ + '!9' '!9,4' '!9,4,11' '!4,CHLD,11,ALRM,9' + +fail_with() +{ + dump_log_and_fail_with \ + "strace -e signal=$* failed to handle an argument error properly" +} + +for arg in ' ' invalid_signal_name SIG -1 256 1-1 \ + 1,2,4,8,16,32,64,128,256,512,1024 9,chdir; do + $STRACE -e signal="$arg" true 2> "$LOG" && + fail_with "$arg" + LC_ALL=C grep -F 'invalid signal' < "$LOG" > /dev/null || + fail_with "$arg" +done + +exit 0