Browse Source

[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.
Marcin Siodelski 11 years ago
parent
commit
ba0df8152a
2 changed files with 5 additions and 1 deletions
  1. 4 0
      src/lib/util/signal_set.cc
  2. 1 1
      src/lib/util/tests/signal_set_unittest.cc

+ 4 - 0
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);

+ 1 - 1
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.