diff options
author | Dmitry V. Levin <ldv@altlinux.org> | 2020-08-01 08:00:00 +0000 |
---|---|---|
committer | Dmitry V. Levin <ldv@altlinux.org> | 2020-08-01 08:00:00 +0000 |
commit | 90e8c0b4b029c1f5bb0e4b34ee450bf0c9071b70 (patch) | |
tree | 5d9618073d97a95480a46f97cf39e9c80cfde3b9 | |
parent | 26df9a6ad7096d3acaa9107cea603aed7067650b (diff) | |
download | strace-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/.gitignore | 1 | ||||
-rw-r--r-- | tests/gen_tests.in | 1 | ||||
-rwxr-xr-x | tests/pure_executables.list | 1 | ||||
-rw-r--r-- | tests/tgkill.c | 69 |
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 |