chiark / gitweb /
service: don't report alien child as alive when it's not
authorRoss Lagerwall <rosslagerwall@gmail.com>
Sun, 9 Jun 2013 16:28:44 +0000 (17:28 +0100)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Sun, 9 Jun 2013 22:26:41 +0000 (18:26 -0400)
When a sigchld is received from an alien child, main_pid is set to
0 then service_enter_running calls main_pid_good to check if the
child is running.  This incorrectly returned true because
kill(main_pid, 0) would return >= 0.

This fixes an error where a service would die and the cgroup would
become empty but the service would still report as active (running).

src/core/service.c

index 20990d2a19bfcd97e0c8dc7f5bfdf612c33f84e7..dadd98123cf6e15a12c6987cf4c0a5e4eaceaaa8 100644 (file)
@@ -1865,7 +1865,7 @@ static int main_pid_good(Service *s) {
 
                 /* If it's an alien child let's check if it is still
                  * alive ... */
 
                 /* If it's an alien child let's check if it is still
                  * alive ... */
-                if (s->main_pid_alien)
+                if (s->main_pid_alien && s->main_pid > 0)
                         return kill(s->main_pid, 0) >= 0 || errno != ESRCH;
 
                 /* .. otherwise assume we'll get a SIGCHLD for it,
                         return kill(s->main_pid, 0) >= 0 || errno != ESRCH;
 
                 /* .. otherwise assume we'll get a SIGCHLD for it,