]> granicus.if.org Git - strace/commitdiff
tests: add a test for sigreturn/rt_sigreturn decoding
authorDmitry V. Levin <ldv@altlinux.org>
Wed, 4 Mar 2015 12:31:18 +0000 (12:31 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Thu, 5 Mar 2015 00:05:27 +0000 (00:05 +0000)
Convert test/sigreturn.c into a regular test.

* test/Makefile (PROGS): Remove sigreturn.
* test/.gitignore: Likewise.
* test/sigreturn.c: Rewrite to ...
* tests/sigreturn.c: ... new file.
* tests/sigreturn.test: New test.
* tests/Makefile.am (check_PROGRAMS): Add sigreturn.
(TESTS): Add sigreturn.test.
* tests/.gitignore: Add sigreturn.

test/.gitignore
test/Makefile
test/sigreturn.c [deleted file]
tests/.gitignore
tests/Makefile.am
tests/sigreturn.c [new file with mode: 0644]
tests/sigreturn.test [new file with mode: 0755]

index b91be8bd30e52e0cace0dde4ba4a2ee585b5526e..b69ccab4a6946f9e78e63d57efbbf89e90994a30 100644 (file)
@@ -6,7 +6,6 @@ mtd
 seccomp
 sig
 sigkill_rain
-sigreturn
 skodic
 threaded_execve
 ubi
index 419b5ca30037039e2ab7af4780bc4a333760737a..56fcd4cdecd2288cdf03b2a78d81cfe8cd1d86ba 100644 (file)
@@ -3,7 +3,7 @@ CFLAGS += -Wall
 PROGS = \
     vfork fork sig skodic clone leaderkill childthread \
     sigkill_rain wait_must_be_interruptible threaded_execve \
-    mtd ubi sigreturn seccomp
+    mtd ubi seccomp
 
 all: $(PROGS)
 
diff --git a/test/sigreturn.c b/test/sigreturn.c
deleted file mode 100644 (file)
index 246a3ce..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Check that strace output contains RT_1 RT_3 RT_31 RT_32 here:
- *  rt_sigprocmask(SIG_BLOCK, [CHLD RT_1 RT_3 RT_31 RT_32], NULL, 8) = 0
- * and here:
- *  sigreturn() (mask [CHLD RT_1 RT_3 RT_31 RT_32]) = 0
- *
- * On x86, both 32-bit and 64-bit strace needs to be checked.
- */
-#include <stdlib.h>
-#include <unistd.h>
-#include <signal.h>
-
-void null_handler(int sig)
-{
-}
-
-int main(int argc, char *argv[])
-{
-       sigset_t set;
-       sigemptyset(&set);
-       sigaddset(&set, SIGCHLD);
-       sigaddset(&set, 33);
-       sigaddset(&set, 35);
-       sigaddset(&set, 63);
-       sigaddset(&set, 64);
-       sigprocmask(SIG_BLOCK, &set, NULL);
-       signal(SIGWINCH, null_handler);
-       raise(SIGWINCH);
-       return 0;
-}
index a55b55693770ad03510142182d327e414acfa151..8efb0ef1d52f67ea0bcf68f0d307c52fb7a81b06 100644 (file)
@@ -15,6 +15,7 @@ scm_rights
 select
 set_ptracer_any
 sigaction
+sigreturn
 stack-fcall
 stat
 stat32
index 36a187d1ce3fd75bff1d1f3ae21aec4cb635aa25..ff5e1366cf629b5c4c6133a02dc004a30b5cff81 100644 (file)
@@ -24,6 +24,7 @@ check_PROGRAMS = \
        select \
        set_ptracer_any \
        sigaction \
+       sigreturn \
        stack-fcall \
        stat \
        stat32 \
@@ -57,6 +58,7 @@ TESTS = \
        scm_rights-fd.test \
        select.test \
        sigaction.test \
+       sigreturn.test \
        stat.test \
        stat32-v.test \
        stat64-v.test \
diff --git a/tests/sigreturn.c b/tests/sigreturn.c
new file mode 100644 (file)
index 0000000..252f152
--- /dev/null
@@ -0,0 +1,24 @@
+#include <stdlib.h>
+#include <signal.h>
+
+static void handler(int sig)
+{
+}
+
+#define RT_0 32
+
+int main(void) {
+       sigset_t set;
+       sigemptyset(&set);
+       sigaddset(&set, SIGUSR2);
+       sigaddset(&set, SIGCHLD);
+       sigaddset(&set, RT_0 +  2);
+       sigaddset(&set, RT_0 +  3);
+       sigaddset(&set, RT_0 +  4);
+       sigaddset(&set, RT_0 + 31);
+       sigaddset(&set, RT_0 + 32);
+       sigprocmask(SIG_SETMASK, &set, NULL);
+       signal(SIGUSR1, handler);
+       raise(SIGUSR1);
+       return 0;
+}
diff --git a/tests/sigreturn.test b/tests/sigreturn.test
new file mode 100755 (executable)
index 0000000..0395e82
--- /dev/null
@@ -0,0 +1,31 @@
+#!/bin/sh
+
+# Check rt_sigprocmask and sigreturn/rt_sigreturn decoding.
+
+. "${srcdir=.}/init.sh"
+
+check_prog grep
+
+./sigreturn ||
+       fail_ 'sigreturn failed'
+
+args='-esignal ./sigreturn'
+$STRACE -o "$LOG" $args ||
+       fail_ "$STRACE $args does not work"
+
+grep_log()
+{
+       LC_ALL=C grep -E -x -e "$*" < "$LOG" > /dev/null || {
+               cat "$LOG"
+               fail_ "$STRACE $args output mismatch"
+       }
+}
+
+mask='\[(USR2 CHLD|CHLD USR2) RT_2 RT_3 RT_4 RT_31 RT_32\]'
+rt_sigprocmask='rt_sigprocmask\(SIG_SETMASK, '"$mask"', NULL, [[:digit:]]+\) += 0'
+osf_sigprocmask='osf_sigprocmask\(SIG_SETMASK, '"$mask"'\) += 0 +\(old mask \[[^]]*\]\)'
+grep_log "$rt_sigprocmask|$osf_sigprocmask"
+grep_log '(rt_)?sigreturn\((\{mask='"$mask"'\})?\) += 0'
+
+
+exit 0