sigchain: fix various off by ones.
Signals start from 1 and end at _NSIG - 1.
Test: m test-art-host
Test: m test-art-target
Change-Id: I09a74bada5acd08ab8f7782075de6f340cdf914e
diff --git a/sigchainlib/sigchain.cc b/sigchainlib/sigchain.cc
index 6d3029d..61346b1 100644
--- a/sigchainlib/sigchain.cc
+++ b/sigchainlib/sigchain.cc
@@ -284,7 +284,9 @@
SigchainAction special_handlers_[2];
};
-static SignalChain chains[_NSIG];
+// _NSIG is 1 greater than the highest valued signal, but signals start from 1.
+// Leave an empty element at index 0 for convenience.
+static SignalChain chains[_NSIG + 1];
void SignalChain::Handler(int signo, siginfo_t* siginfo, void* ucontext_raw) {
// Try the special handlers first.
@@ -358,7 +360,7 @@
// action but don't pass it on to the kernel.
// Note that we check that the signal number is in range here. An out of range signal
// number should behave exactly as the libc sigaction.
- if (signal < 0 || signal >= _NSIG) {
+ if (signal <= 0 || signal >= _NSIG) {
errno = EINVAL;
return -1;
}
@@ -396,7 +398,7 @@
extern "C" sighandler_t signal(int signo, sighandler_t handler) {
InitializeSignalChain();
- if (signo < 0 || signo > _NSIG) {
+ if (signo <= 0 || signo >= _NSIG) {
errno = EINVAL;
return SIG_ERR;
}
@@ -449,7 +451,7 @@
if (how == SIG_BLOCK || how == SIG_SETMASK) {
// Don't allow claimed signals in the mask. If a signal chain has been claimed
// we can't allow the user to block that signal.
- for (int i = 0 ; i < _NSIG; ++i) {
+ for (int i = 1; i < _NSIG; ++i) {
if (chains[i].IsClaimed() && sigismember(&tmpset, i)) {
sigdelset(&tmpset, i);
}