Skip to content

Commit

Permalink
core: fix race condition during startup of a service with ExitType=cg…
Browse files Browse the repository at this point in the history
…roup

This commit allows service_sigchld_event() is executed before
service_dispatch_exec_io(), which might happen when a main process exits
very quickly.

Also do not check PID for service goodness because the main process have
already been exited in this case.

Fix: #27919
  • Loading branch information
ftake authored and YHNdnzj committed Jul 14, 2023
1 parent a035a33 commit ef43006
Showing 1 changed file with 7 additions and 2 deletions.
9 changes: 7 additions & 2 deletions src/core/service.c
Expand Up @@ -2231,7 +2231,7 @@ static bool service_good(Service *s) {
main_pid_ok = main_pid_good(s);
if (main_pid_ok > 0) /* It's alive */
return true;
if (main_pid_ok == 0) /* It's dead */
if (main_pid_ok == 0 && s->exit_type == SERVICE_EXIT_MAIN) /* It's dead */
return false;

/* OK, we don't know anything about the main PID, maybe
Expand Down Expand Up @@ -3879,7 +3879,12 @@ static void service_sigchld_event(Unit *u, pid_t pid, int code, int status) {
default:
assert_not_reached();
}
}
} else if (s->exit_type == SERVICE_EXIT_CGROUP && s->state == SERVICE_START)
/* If a main process exits very quickly, this function might be executed
* before service_dispatch_exec_io(). Since this function disabled IO events
* to monitor the main process above, we need to update the state here too.
* Let's consider the process is successfully launched and exited. */
service_enter_start_post(s);
}

} else if (s->control_pid == pid) {
Expand Down

0 comments on commit ef43006

Please sign in to comment.