]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
core: add comment explaining event source deallocation
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Thu, 1 Jul 2021 09:06:45 +0000 (11:06 +0200)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Tue, 20 Jul 2021 15:59:53 +0000 (17:59 +0200)
Followup for bc989831e6. The original reproducer still works w/o the unref,
and doesn't work with this change.

(cherry picked from commit 13bb1ffb912cacea4041910e38674e0984ac5772)
(cherry picked from commit d82da0f04f6ebe7044f4c33b9067c17c909a8d5d)

src/core/service.c

index dd4eb3fe9f9123bf62edc20ffdd1a8adbaaca73d..6caffc2f271c00882d93a48c1e2b7a2ffd6519b5 100644 (file)
@@ -3409,11 +3409,6 @@ static void service_sigchld_event(Unit *u, pid_t pid, int code, int status) {
         else
                 clean_mode = EXIT_CLEAN_DAEMON;
 
-        if (s->main_pid == pid)
-                /* Clean up the exec_fd event source. The source owns its end of the pipe, so this will close
-                 * that too. */
-                s->exec_fd_event_source = sd_event_source_disable_unref(s->exec_fd_event_source);
-
         if (is_clean_exit(code, status, clean_mode, &s->success_status))
                 f = SERVICE_SUCCESS;
         else if (code == CLD_EXITED)
@@ -3426,6 +3421,11 @@ static void service_sigchld_event(Unit *u, pid_t pid, int code, int status) {
                 assert_not_reached("Unknown code");
 
         if (s->main_pid == pid) {
+                /* Clean up the exec_fd event source. We want to do this here, not later in
+                 * service_set_state(), because service_enter_stop_post() calls service_spawn().
+                 * The source owns its end of the pipe, so this will close that too. */
+                s->exec_fd_event_source = sd_event_source_disable_unref(s->exec_fd_event_source);
+
                 /* Forking services may occasionally move to a new PID.
                  * As long as they update the PID file before exiting the old
                  * PID, they're fine. */