diff options
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 |