From 3ec014198681fdf7b90b5279b203846df474a30d Mon Sep 17 00:00:00 2001 From: Chris Paulson-Ellis Date: Thu, 2 Feb 2012 17:32:05 +0000 Subject: [PATCH] util: prevent daemon-reload from reaping service processes. The reaping of generator processes run as part of a daemon-reload should not call waitid(PID_ALL). The waitid() call in execute_directory() is intended only to reap the executed processes, but if a service process exits at about the same time as a daemon-reload, then that service process is reaped as well, preventing it from being reaped in the proper place in manager_dispatch_sigchld(). Fixes https://bugs.freedesktop.org/show_bug.cgi?id=43625 (cherry picked from commit ec3f9b53f882623e6572258ba15234b1ee108b7f) --- src/util.c | 3 ++- 1 files changed, 2 insertions(+), 1 deletions(-) diff --git a/src/util.c b/src/util.c index ed939a2..d942d31 100644 --- a/src/util.c +++ b/src/util.c @@ -4470,11 +4470,12 @@ void execute_directory(const char *directory, DIR *d, char *argv[]) { } while (!hashmap_isempty(pids)) { + pid_t pid = PTR_TO_UINT(hashmap_first_key(pids)); siginfo_t si; char *path; zero(si); - if (waitid(P_ALL, 0, &si, WEXITED) < 0) { + if (waitid(P_PID, pid, &si, WEXITED) < 0) { if (errno == EINTR) continue;