service: check error from kill when checking ability to track child.
authorDavin McCall <davmac@davmac.org>
Tue, 27 Jun 2017 08:54:31 +0000 (09:54 +0100)
committerDavin McCall <davmac@davmac.org>
Tue, 27 Jun 2017 08:54:31 +0000 (09:54 +0100)
We check whether the process exists using kill. We were treating any
error return as meaning the process ID was invalid, but in fact we may
simply not have permission to signal the process (if we are not being
run as root and the service process is suid).

src/service.cc

index 892edcbeb5cb83f25e4850027f8408eeb812c828..274e9f40b8221cc095b9101b66a298f36cf35906 100644 (file)
@@ -752,7 +752,7 @@ bgproc_service::read_pid_file(int *exit_status) noexcept
         pid_t wait_r = waitpid(pid, exit_status, WNOHANG);
         if (wait_r == -1 && errno == ECHILD) {
             // We can't track this child - check process exists:
-            if (kill(pid, 0) == 0) {
+            if (kill(pid, 0) == 0 || errno != ESRCH) {
                 tracking_child = false;
                 return pid_result_t::OK;
             }