diff options
author | Josh Gao <jmgao@google.com> | 2016-03-10 00:00:54 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2016-03-10 00:00:54 +0000 |
commit | 79c9ff28f95b718db3ff5528b49e60e225fc56fd (patch) | |
tree | 1584ad7b10653b6c68dfd77869b174632b7f958e /tests/signal_test.cpp | |
parent | 2512310fd4a5fcc01e9c66bd44a87aeeac255fc2 (diff) | |
parent | 61cf3f3e033d2d7d13b06e0ae009ff12db787860 (diff) |
Merge "debuggerd: rethrow the full signal we receive, always."
Diffstat (limited to 'tests/signal_test.cpp')
-rw-r--r-- | tests/signal_test.cpp | 39 |
1 files changed, 37 insertions, 2 deletions
diff --git a/tests/signal_test.cpp b/tests/signal_test.cpp index f8fdc3f99..8c1e83469 100644 --- a/tests/signal_test.cpp +++ b/tests/signal_test.cpp @@ -14,12 +14,14 @@ * limitations under the License. */ +#include <errno.h> #include <signal.h> +#include <sys/syscall.h> +#include <sys/types.h> +#include <unistd.h> #include <gtest/gtest.h> -#include <errno.h> - #include "ScopedSignalHandler.h" static size_t SIGNAL_MIN() { @@ -375,3 +377,36 @@ TEST(signal, sigtimedwait_timeout) { ASSERT_EQ(0, sigprocmask(SIG_SETMASK, &original_set, NULL)); } + +#if defined(__BIONIC__) +TEST(signal, rt_tgsigqueueinfo) { + // Test whether rt_tgsigqueueinfo allows sending arbitrary si_code values to self. + // If this fails, your kernel needs commit 66dd34a to be backported. + static constexpr char error_msg[] = + "\nPlease ensure that the following kernel patch has been applied:\n" + "* https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=66dd34ad31e5963d72a700ec3f2449291d322921\n"; + static siginfo received; + + struct sigaction handler = {}; + handler.sa_sigaction = [](int, siginfo_t* siginfo, void*) { received = *siginfo; }; + handler.sa_flags = SA_SIGINFO; + + ASSERT_EQ(0, sigaction(SIGUSR1, &handler, nullptr)); + + siginfo sent = {}; + + sent.si_code = SI_TKILL; + ASSERT_EQ(0, syscall(SYS_rt_tgsigqueueinfo, getpid(), gettid(), SIGUSR1, &sent)) + << "rt_tgsigqueueinfo failed: " << strerror(errno) << error_msg; + ASSERT_EQ(sent.si_code, received.si_code) << "rt_tgsigqueueinfo modified si_code, expected " + << sent.si_code << ", received " << received.si_code + << error_msg; + + sent.si_code = SI_USER; + ASSERT_EQ(0, syscall(SYS_rt_tgsigqueueinfo, getpid(), gettid(), SIGUSR1, &sent)) + << "rt_tgsigqueueinfo failed: " << strerror(errno) << error_msg; + ASSERT_EQ(sent.si_code, received.si_code) << "rt_tgsigqueueinfo modified si_code, expected " + << sent.si_code << ", received " << received.si_code + << error_msg; +} +#endif |