tests: check how signals are unblocked in interactive mode

* tests/block_reset_raise_run.c: New file.
* tests/interactive_block.test: New test.
* tests/.gitignore: Add block_reset_raise_run.
* tests/Makefile.am (check_PROGRAMS): Likewise.
(MISC_TESTS): Add interactive_block.test.
This commit is contained in:
Дмитрий Левин 2017-05-27 10:00:43 +00:00
parent f83b49b03a
commit 2d2bc8fdc1
4 changed files with 73 additions and 0 deletions

1
tests/.gitignore vendored
View File

@ -17,6 +17,7 @@ attach-f-p
attach-f-p-cmd
attach-p-cmd-cmd
attach-p-cmd-p
block_reset_raise_run
bpf
brk
btrfs

View File

@ -77,6 +77,7 @@ check_PROGRAMS = $(PURE_EXECUTABLES) \
attach-f-p-cmd \
attach-p-cmd-cmd \
attach-p-cmd-p \
block_reset_raise_run \
caps-abbrev \
count-f \
execve-v \
@ -241,6 +242,7 @@ MISC_TESTS = \
detach-stopped.test \
filter-unavailable.test \
get_regs.test \
interactive_block.test \
ksysent.test \
opipe.test \
options-syntax.test \

View File

@ -0,0 +1,55 @@
/*
* Execute a command with blocked, reset, and raised signal.
*
* Copyright (c) 2017 Dmitry V. Levin <ldv@altlinux.org>
* 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 <signal.h>
#include <stdlib.h>
#include <unistd.h>
int
main(int ac, char **av)
{
if (ac < 3)
error_msg_and_fail("usage: block_reset_raise_run signo path...");
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_BLOCK, &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]);
execvp(av[2], av + 2);
perror_msg_and_fail("execvp: %s", av[2]);
}

15
tests/interactive_block.test Executable file
View File

@ -0,0 +1,15 @@
#!/bin/sh
# Check that in interactive mode those signals that were blocked
# at strace startup will remain blocked.
. "${srcdir=.}/init.sh"
strace0="$STRACE"
for signo in 1 2 3 13 14 15; do
blocksig="../block_reset_raise_run $signo"
run_prog $blocksig ../umovestr
STRACE="$blocksig $strace0"
run_strace -I2 -echdir ../umovestr
match_diff "$LOG" "$srcdir/umovestr.expected"
done