Commit ba0df815 authored by Marcin Siodelski's avatar Marcin Siodelski
Browse files

[3405] Properly initialize sigaction data for SignalSet object.

Had to use memset to reset sa_action structure. Without that the signal
handled wasn't installed correctly because of the random data in the
sigaction structure and caused unit tests to fail.
parent 78e93d36
......@@ -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);
......
......@@ -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.
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment