]> git.ipfire.org Git - thirdparty/kea.git/commitdiff
[support8785] Likely fix for the issues with "no child processes" exception
authorTomek Mrugalski <tomasz@isc.org>
Tue, 18 Aug 2015 12:08:00 +0000 (14:08 +0200)
committerTomek Mrugalski <tomasz@isc.org>
Thu, 20 Aug 2015 12:58:54 +0000 (14:58 +0200)
  This fix makes the signal handler no longer modify errno value.
  That was causing "no child processes" exceptions in places that
  had nothing to do with signals or processes.

src/lib/util/process_spawn.cc

index 34e8dba193a8615aab45017b75eec3eae0997f6c..0870e934a455b6d5b7a2e9288f8c9fb7b1ddf5f7 100644 (file)
@@ -19,6 +19,7 @@
 #include <map>
 #include <signal.h>
 #include <stdlib.h>
+#include <errno.h>
 #include <unistd.h>
 #include <sys/wait.h>
 
@@ -279,6 +280,11 @@ ProcessSpawnImpl::waitForProcess(int signum) {
     if (signum != SIGCHLD) {
         return (false);
     }
+
+    // Need to store current value of errno, so we could restore it
+    // after this signal handler does his work.
+    int errno_value = errno;
+
     for (;;) {
         int status = 0;
         pid_t pid = waitpid(-1, &status, WNOHANG);
@@ -294,6 +300,16 @@ ProcessSpawnImpl::waitForProcess(int signum) {
             proc->second.running_ = false;
         }
     }
+
+    // Need to restore previous value of errno. We called waitpid(),
+    // which likely indicated its result by setting errno to ECHILD.
+    // This is a signal handler, which can be called while virtually
+    // any other code being run. If we're unlucky, we could receive a
+    // signal when running a code that is about to check errno. As a
+    // result the code would detect errno=ECHILD in places which are
+    // completely unrelated to child or processes in general.
+    errno = errno_value;
+
     return (true);
 }