From: Fuminobu TAKEYAMA Date: Mon, 10 Jul 2023 15:30:27 +0000 (+0900) Subject: core: fix race condition during startup of a service with ExitType=cgroup X-Git-Tag: v254-rc2~27 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=ef4300654e70e76ed74f7d544e0f44c5d92fb698;p=thirdparty%2Fsystemd.git core: fix race condition during startup of a service with ExitType=cgroup 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 --- diff --git a/src/core/service.c b/src/core/service.c index c6178cf2cd7..8e1b227a8bf 100644 --- a/src/core/service.c +++ b/src/core/service.c @@ -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 @@ -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) {