]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[3405] Properly initialize sigaction data for SignalSet object.
authorMarcin Siodelski <marcin@isc.org>
Fri, 6 Jun 2014 08:57:24 +0000 (10:57 +0200)
committerMarcin Siodelski <marcin@isc.org>
Fri, 6 Jun 2014 08:57:24 +0000 (10:57 +0200)
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.

src/lib/util/signal_set.cc
src/lib/util/tests/signal_set_unittest.cc

index 5834c409f2aabd25a4faf59dbccc2f037d392279..2d8b4135512dff78c83c1431bbb50b6fda312e38 100644 (file)
@@ -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);
index 58bc0d87604f08bb297a2754ec4400301eb962d8..89714a8a6612f09f9f9ed5c4b088ae5b4deccf89 100644 (file)
@@ -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.