summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry V. Levin <ldv@altlinux.org>2020-08-01 08:00:00 +0000
committerDmitry V. Levin <ldv@altlinux.org>2020-08-01 08:00:00 +0000
commit90e8c0b4b029c1f5bb0e4b34ee450bf0c9071b70 (patch)
tree5d9618073d97a95480a46f97cf39e9c80cfde3b9
parent26df9a6ad7096d3acaa9107cea603aed7067650b (diff)
downloadstrace-90e8c0b4b029c1f5bb0e4b34ee450bf0c9071b70.tar.gz
tests: check decoding of tgkill syscall
* tests/tgkill.c: New file. * tests/gen_tests.in (tgkill): New entry. * tests/pure_executables.list: Add tgkill. * tests/.gitignore: Likewise.
-rw-r--r--tests/.gitignore1
-rw-r--r--tests/gen_tests.in1
-rwxr-xr-xtests/pure_executables.list1
-rw-r--r--tests/tgkill.c69
4 files changed, 72 insertions, 0 deletions
diff --git a/tests/.gitignore b/tests/.gitignore
index e5d059a78..0031d04d7 100644
--- a/tests/.gitignore
+++ b/tests/.gitignore
@@ -729,6 +729,7 @@ sysinfo
syslog
syslog-success
tee
+tgkill
threads-execve
threads-execve--quiet-thread-execve
threads-execve-q
diff --git a/tests/gen_tests.in b/tests/gen_tests.in
index 2879d6bfe..6f8e1420e 100644
--- a/tests/gen_tests.in
+++ b/tests/gen_tests.in
@@ -663,6 +663,7 @@ sync_file_range2
sysinfo -a14
syslog -a35
tee
+tgkill -a15 --signal='!cont'
threads-execve--quiet-thread-execve +threads-execve.test -s40 --quiet=personality,thread-execve
threads-execve-q +threads-execve.test -q
threads-execve-qq +threads-execve.test -qq
diff --git a/tests/pure_executables.list b/tests/pure_executables.list
index d709ac62f..01619fcf0 100755
--- a/tests/pure_executables.list
+++ b/tests/pure_executables.list
@@ -590,6 +590,7 @@ sync_file_range2
sysinfo
syslog
tee
+tgkill
time
timer_create
timer_xettime
diff --git a/tests/tgkill.c b/tests/tgkill.c
new file mode 100644
index 000000000..901be3764
--- /dev/null
+++ b/tests/tgkill.c
@@ -0,0 +1,69 @@
+/*
+ * Check decoding of tgkill syscall.
+ *
+ * Copyright (c) 2020 Dmitry V. Levin <ldv@altlinux.org>
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "tests.h"
+#include "scno.h"
+
+#ifdef __NR_tgkill
+
+# include <signal.h>
+# include <stdio.h>
+# include <unistd.h>
+
+static const char *errstr;
+
+static long
+k_tgkill(const unsigned int tgid,
+ const unsigned int tid,
+ const unsigned int sig)
+{
+ const kernel_ulong_t fill = (kernel_ulong_t) 0xdefaced00000000ULL;
+ const kernel_ulong_t bad = (kernel_ulong_t) 0xbadc0dedbadc0dedULL;
+ const kernel_ulong_t arg1 = fill | tgid;
+ const kernel_ulong_t arg2 = fill | tid;
+ const kernel_ulong_t arg3 = fill | sig;
+ const long rc = syscall(__NR_tgkill, arg1, arg2, arg3, bad, bad, bad);
+ errstr = sprintrc(rc);
+ return rc;
+}
+
+int
+main(void)
+{
+ const int pid = getpid();
+ const int bad_pid = -1;
+ const int bad_sig = 0xface;
+
+ k_tgkill(pid, pid, 0);
+ printf("tgkill(%d, %d, 0) = %s\n", pid, pid, errstr);
+
+ k_tgkill(pid, bad_pid, 0);
+ printf("tgkill(%d, %d, 0) = %s\n", pid, bad_pid, errstr);
+
+ k_tgkill(bad_pid, pid, 0);
+ printf("tgkill(%d, %d, 0) = %s\n", bad_pid, pid, errstr);
+
+ k_tgkill(pid, pid, SIGCONT);
+ printf("tgkill(%d, %d, SIGCONT) = %s\n", pid, pid, errstr);
+
+ k_tgkill(pid, pid, bad_sig);
+ printf("tgkill(%d, %d, %d) = %s\n", pid, pid, bad_sig, errstr);
+
+ k_tgkill(pid, pid, -bad_sig);
+ printf("tgkill(%d, %d, %d) = %s\n", pid, pid, -bad_sig, errstr);
+
+ puts("+++ exited with 0 +++");
+ return 0;
+}
+
+#else
+
+SKIP_MAIN_UNDEFINED("__NR_tgkill")
+
+#endif