diff --git a/src/lib/util/signal_set.cc b/src/lib/util/signal_set.cc index 5834c409f2..2d8b413551 100644 --- a/src/lib/util/signal_set.cc +++ b/src/lib/util/signal_set.cc @@ -101,7 +101,9 @@ void SignalSet::add(const int sig) { insert(sig); struct sigaction sa; + memset(&sa, 0, sizeof(sa)); sa.sa_handler = internalHandler; + sigfillset(&sa.sa_mask); if (sigaction(sig, &sa, 0) < 0) { erase(sig); isc_throw(SignalSetError, "failed to register a signal handler for" @@ -209,7 +211,9 @@ SignalSet::remove(const int sig) { // Unregister only if we own this signal. if (local_signals_.find(sig) != local_signals_.end()) { struct sigaction sa; + memset(&sa, 0, sizeof(sa)); sa.sa_handler = SIG_DFL; + sigfillset(&sa.sa_mask); if (sigaction(sig, &sa, 0) < 0) { isc_throw(SignalSetError, "unable to restore original signal" " handler for signal: " << sig); diff --git a/src/lib/util/tests/signal_set_unittest.cc b/src/lib/util/tests/signal_set_unittest.cc index 58bc0d8760..89714a8a66 100644 --- a/src/lib/util/tests/signal_set_unittest.cc +++ b/src/lib/util/tests/signal_set_unittest.cc @@ -78,7 +78,7 @@ int SignalSetTest::signum_ = -1; /// Check that the signals are recorded by the signal handlers. TEST_F(SignalSetTest, twoSignals) { // Register handlers for two signals. - signal_set_.reset(new SignalSet(SIGHUP, SIGINT)); + ASSERT_NO_THROW(signal_set_.reset(new SignalSet(SIGHUP, SIGINT))); // Send SIGHUP signal to the process. ASSERT_EQ(0, raise(SIGHUP)); // The SIGHUP should be the next one in the queue to be handled.