Add `struct sigaction64` and `sigaction64`.
Bug: http://b/72493232
Test: ran tests
Change-Id: I47b0560a30aa33a9b1f1978dfb7f84d2e3d389b8
diff --git a/tests/BionicDeathTest.h b/tests/BionicDeathTest.h
index 3e8d7b2..6826ab7 100644
--- a/tests/BionicDeathTest.h
+++ b/tests/BionicDeathTest.h
@@ -21,25 +21,28 @@
#include <gtest/gtest.h>
+#if !defined(__BIONIC__)
+#define sigaction64 sigaction
+#endif
+
class BionicDeathTest : public testing::Test {
protected:
virtual void SetUp() {
// Suppress debuggerd stack traces. Too slow.
for (int signo : { SIGABRT, SIGBUS, SIGSEGV, SIGSYS }) {
- struct sigaction action = {};
- action.sa_handler = SIG_DFL;
- sigaction(signo, &action, &previous_);
+ struct sigaction64 action = { .sa_handler = SIG_DFL };
+ sigaction64(signo, &action, &previous_);
}
}
virtual void TearDown() {
for (int signo : { SIGABRT, SIGBUS, SIGSEGV, SIGSYS }) {
- sigaction(signo, &previous_, nullptr);
+ sigaction64(signo, &previous_, nullptr);
}
}
private:
- struct sigaction previous_;
+ struct sigaction64 previous_;
};
#endif // BIONIC_TESTS_BIONIC_DEATH_TEST_H_
diff --git a/tests/ScopedSignalHandler.h b/tests/ScopedSignalHandler.h
index 85c41a8..36bbf10 100644
--- a/tests/ScopedSignalHandler.h
+++ b/tests/ScopedSignalHandler.h
@@ -26,6 +26,7 @@
#define posix_spawnattr_setsigdefault64 posix_spawnattr_setsigdefault
#define posix_spawnattr_setsigmask64 posix_spawnattr_setsigmask
#define pthread_sigmask64 pthread_sigmask
+#define sigaction64 sigaction
#define sigaddset64 sigaddset
#define sigdelset64 sigdelset
#define sigemptyset64 sigemptyset
@@ -47,7 +48,7 @@
memset(&action_, 0, sizeof(action_));
action_.sa_flags = sa_flags;
action_.sa_handler = handler;
- sigaction(signal_number_, &action_, &old_action_);
+ sigaction64(signal_number_, &action_, &old_action_);
}
ScopedSignalHandler(int signal_number, void (*action)(int, siginfo_t*, void*),
@@ -56,20 +57,20 @@
memset(&action_, 0, sizeof(action_));
action_.sa_flags = sa_flags;
action_.sa_sigaction = action;
- sigaction(signal_number_, &action_, &old_action_);
+ sigaction64(signal_number_, &action_, &old_action_);
}
ScopedSignalHandler(int signal_number) : signal_number_(signal_number) {
- sigaction(signal_number, nullptr, &old_action_);
+ sigaction64(signal_number, nullptr, &old_action_);
}
~ScopedSignalHandler() {
- sigaction(signal_number_, &old_action_, NULL);
+ sigaction64(signal_number_, &old_action_, NULL);
}
private:
- struct sigaction action_;
- struct sigaction old_action_;
+ struct sigaction64 action_;
+ struct sigaction64 old_action_;
const int signal_number_;
};
diff --git a/tests/signal_test.cpp b/tests/signal_test.cpp
index ebc079e..87a918f 100644
--- a/tests/signal_test.cpp
+++ b/tests/signal_test.cpp
@@ -269,55 +269,63 @@
ASSERT_EQ(1, g_sigsuspend64_signal_handler_call_count);
}
-static void EmptySignalHandler(int) {}
-static void EmptySignalAction(int, siginfo_t*, void*) {}
-
-TEST(signal, sigaction) {
+template <typename SigActionT, typename SigSetT>
+static void TestSigAction(int (sigaction_fn)(int, const SigActionT*, SigActionT*),
+ int (sigaddset_fn)(SigSetT*, int),
+ int sig) {
// Both bionic and glibc set SA_RESTORER when talking to the kernel on arm,
// arm64, x86, and x86-64. The version of glibc we're using also doesn't
// define SA_RESTORER, but luckily it's the same value everywhere, and mips
// doesn't use the bit for anything.
static const unsigned sa_restorer = 0x4000000;
- // See what's currently set for SIGALRM.
- struct sigaction original_sa;
- memset(&original_sa, 0, sizeof(original_sa));
- ASSERT_EQ(0, sigaction(SIGALRM, NULL, &original_sa));
+ // See what's currently set for this signal.
+ SigActionT original_sa = {};
+ ASSERT_EQ(0, sigaction_fn(sig, NULL, &original_sa));
ASSERT_TRUE(original_sa.sa_handler == NULL);
ASSERT_TRUE(original_sa.sa_sigaction == NULL);
ASSERT_EQ(0U, original_sa.sa_flags & ~sa_restorer);
// Set a traditional sa_handler signal handler.
- struct sigaction sa;
- memset(&sa, 0, sizeof(sa));
- sigaddset(&sa.sa_mask, SIGALRM);
+ auto no_op_signal_handler = [](int) {};
+ SigActionT sa = {};
+ sigaddset_fn(&sa.sa_mask, sig);
sa.sa_flags = SA_ONSTACK;
- sa.sa_handler = EmptySignalHandler;
- ASSERT_EQ(0, sigaction(SIGALRM, &sa, NULL));
+ sa.sa_handler = no_op_signal_handler;
+ ASSERT_EQ(0, sigaction_fn(sig, &sa, NULL));
// Check that we can read it back.
- memset(&sa, 0, sizeof(sa));
- ASSERT_EQ(0, sigaction(SIGALRM, NULL, &sa));
- ASSERT_TRUE(sa.sa_handler == EmptySignalHandler);
+ sa = {};
+ ASSERT_EQ(0, sigaction_fn(sig, NULL, &sa));
+ ASSERT_TRUE(sa.sa_handler == no_op_signal_handler);
ASSERT_TRUE((void*) sa.sa_sigaction == (void*) sa.sa_handler);
ASSERT_EQ(static_cast<unsigned>(SA_ONSTACK), sa.sa_flags & ~sa_restorer);
// Set a new-style sa_sigaction signal handler.
- memset(&sa, 0, sizeof(sa));
- sigaddset(&sa.sa_mask, SIGALRM);
+ auto no_op_sigaction = [](int, siginfo_t*, void*) {};
+ sa = {};
+ sigaddset_fn(&sa.sa_mask, sig);
sa.sa_flags = SA_ONSTACK | SA_SIGINFO;
- sa.sa_sigaction = EmptySignalAction;
- ASSERT_EQ(0, sigaction(SIGALRM, &sa, NULL));
+ sa.sa_sigaction = no_op_sigaction;
+ ASSERT_EQ(0, sigaction_fn(sig, &sa, NULL));
// Check that we can read it back.
- memset(&sa, 0, sizeof(sa));
- ASSERT_EQ(0, sigaction(SIGALRM, NULL, &sa));
- ASSERT_TRUE(sa.sa_sigaction == EmptySignalAction);
+ sa = {};
+ ASSERT_EQ(0, sigaction_fn(sig, NULL, &sa));
+ ASSERT_TRUE(sa.sa_sigaction == no_op_sigaction);
ASSERT_TRUE((void*) sa.sa_sigaction == (void*) sa.sa_handler);
ASSERT_EQ(static_cast<unsigned>(SA_ONSTACK | SA_SIGINFO), sa.sa_flags & ~sa_restorer);
// Put everything back how it was.
- ASSERT_EQ(0, sigaction(SIGALRM, &original_sa, NULL));
+ ASSERT_EQ(0, sigaction_fn(sig, &original_sa, NULL));
+}
+
+TEST(signal, sigaction) {
+ TestSigAction(sigaction, sigaddset, SIGALRM);
+}
+
+TEST(signal, sigaction64_SIGRTMIN) {
+ TestSigAction(sigaction64, sigaddset64, SIGRTMIN);
}
TEST(signal, sys_signame) {
@@ -495,8 +503,7 @@
"* https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=66dd34ad31e5963d72a700ec3f2449291d322921\n";
static siginfo received;
- struct sigaction handler;
- memset(&handler, 0, sizeof(handler));
+ struct sigaction handler = {};
handler.sa_sigaction = [](int, siginfo_t* siginfo, void*) { received = *siginfo; };
handler.sa_flags = SA_SIGINFO;