]> arthur.barton.de Git - netatalk.git/commitdiff
Improve reliability of afpd child handler
authorRalph Boehme <rb@sernet.de>
Tue, 8 Apr 2014 09:55:58 +0000 (11:55 +0200)
committerRalph Boehme <rb@sernet.de>
Tue, 8 Apr 2014 09:55:58 +0000 (11:55 +0200)
NEWS
etc/afpd/main.c

diff --git a/NEWS b/NEWS
index 997ede1706d3df88cde195e375cf62212f8a82e2..70304f7b181973e43e150f0a5facb10a511a2db6 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -2,6 +2,7 @@ Changes in 3.1.2
 ================
 * FIX: Option "vol dbpath" was broken in 3.1.1
 * FIX: Spotlight: file modification date, bug #545
+* FIX: Improve reliability of afpd child handler
 
 Changes in 3.1.1
 ================
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);
     }
 }