From: Yu Watanabe Date: Wed, 29 Dec 2021 03:04:46 +0000 (+0900) Subject: manager: always close idle pipe when sending ready notification X-Git-Tag: v251-rc1~631 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9c1b17c3dc1541df02118ee3aaf6dd5dd540cdc2;p=thirdparty%2Fsystemd.git manager: always close idle pipe when sending ready notification This fixes a bug introduced by 6d9326595592f98e8126eacb4176acd8c3516d5c. The commit makes several functions skipped if the manager is already in finished state, as > In manager_check_finished(), more steps are skipped if MANAGER_IS_FINISHED(). > Those steps are idempotent, but no need to waste cycles trying to do them > more than once. However, the idle pipe may be re-opened after manager is finished: manager_dispatch_run_queue() -> manager_watch_idle_pipe(). So, the closing the pipe is not idempotent here. Fixes #21889. --- diff --git a/src/core/manager.c b/src/core/manager.c index 2946f580666..601e15f6892 100644 --- a/src/core/manager.c +++ b/src/core/manager.c @@ -3557,14 +3557,14 @@ void manager_check_finished(Manager *m) { manager_send_ready(m); + /* Notify Type=idle units that we are done now */ + manager_close_idle_pipe(m); + if (MANAGER_IS_FINISHED(m)) return; manager_flip_auto_status(m, false, "boot finished"); - /* Notify Type=idle units that we are done now */ - manager_close_idle_pipe(m); - /* Turn off confirm spawn now */ m->confirm_spawn = NULL;