From e4e8f3a8eacf29910b8b82d5955fe3464f1b5b11 Mon Sep 17 00:00:00 2001 From: Ralph Boehme Date: Tue, 8 Apr 2014 11:55:58 +0200 Subject: [PATCH] Improve reliability of afpd child handler --- NEWS | 1 + etc/afpd/main.c | 12 +++++++----- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/NEWS b/NEWS index 997ede17..70304f7b 100644 --- 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 ================ diff --git a/etc/afpd/main.c b/etc/afpd/main.c index ac1ce217..87c07b0e 100644 --- a/etc/afpd/main.c +++ b/etc/afpd/main.c @@ -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); } } -- 2.39.2