]> arthur.barton.de Git - netatalk.git/blobdiff - etc/afpd/main.c
Improve reliability of afpd child handler
[netatalk.git] / etc / afpd / main.c
index ac1ce217b31904593f30b0ce4aa5d57617df323a..87c07b0eb96b13c79ecc5216118b7248b0e53eeb 100644 (file)
@@ -141,11 +141,6 @@ static void child_handler(void)
 #endif /* ! WAIT_ANY */
 
     while ((pid = waitpid(WAIT_ANY, &status, WNOHANG)) > 0) {
-        if ((fd = server_child_remove(server_children, pid)) != -1) {
-            fdset_del_fd(&fdset, &polldata, &fdset_used, &fdset_size, fd);        
-            break;
-        }
-
         if (WIFEXITED(status)) {
             if (WEXITSTATUS(status))
                 LOG(log_info, logtype_afpd, "child[%d]: exited %d", pid, WEXITSTATUS(status));
@@ -157,6 +152,13 @@ static void child_handler(void)
             else
                 LOG(log_info, logtype_afpd, "child[%d]: died", pid);
         }
+
+        fd = server_child_remove(server_children, pid);
+        if (fd == -1) {
+            LOG(log_error, logtype_afpd, "child[%d]: bad IPC fd", pid);
+            continue;
+        }
+        fdset_del_fd(&fdset, &polldata, &fdset_used, &fdset_size, fd);
     }
 }