From: Yu Watanabe Date: Thu, 21 Aug 2025 17:06:43 +0000 (+0900) Subject: core/unit: use UNIT_FOREACH_DEPENDENCY_SAFE() at several more places X-Git-Tag: v258-rc4~56 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=64fc4917b9149ffe6defaf5ceaf3236324537a3f;p=thirdparty%2Fsystemd.git core/unit: use UNIT_FOREACH_DEPENDENCY_SAFE() at several more places manager_add_job() -> transaction_add_job_and_dependencies() may update dependencies when a unit is not loaded yet. Hence, we need to restart dependency loop in that case. Follow-up for b7777d08846033859c5b734317fbbbfcca4cafcb (#37465). Fixes #38676. --- diff --git a/src/core/unit.c b/src/core/unit.c index a25f755c113..1eb4de64629 100644 --- a/src/core/unit.c +++ b/src/core/unit.c @@ -2276,17 +2276,17 @@ static void retroactively_start_dependencies(Unit *u) { assert(u); assert(UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(u))); - UNIT_FOREACH_DEPENDENCY(other, u, UNIT_ATOM_RETROACTIVE_START_REPLACE) /* Requires= + BindsTo= */ + UNIT_FOREACH_DEPENDENCY_SAFE(other, u, UNIT_ATOM_RETROACTIVE_START_REPLACE) /* Requires= + BindsTo= */ if (!unit_has_dependency(u, UNIT_ATOM_AFTER, other) && !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other))) (void) manager_add_job(u->manager, JOB_START, other, JOB_REPLACE, /* error = */ NULL, /* ret = */ NULL); - UNIT_FOREACH_DEPENDENCY(other, u, UNIT_ATOM_RETROACTIVE_START_FAIL) /* Wants= */ + UNIT_FOREACH_DEPENDENCY_SAFE(other, u, UNIT_ATOM_RETROACTIVE_START_FAIL) /* Wants= */ if (!unit_has_dependency(u, UNIT_ATOM_AFTER, other) && !UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other))) (void) manager_add_job(u->manager, JOB_START, other, JOB_FAIL, /* error = */ NULL, /* ret = */ NULL); - UNIT_FOREACH_DEPENDENCY(other, u, UNIT_ATOM_RETROACTIVE_STOP_ON_START) /* Conflicts= (and inverse) */ + UNIT_FOREACH_DEPENDENCY_SAFE(other, u, UNIT_ATOM_RETROACTIVE_STOP_ON_START) /* Conflicts= (and inverse) */ if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other))) (void) manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, /* error = */ NULL, /* ret = */ NULL); } @@ -2298,7 +2298,7 @@ static void retroactively_stop_dependencies(Unit *u) { assert(UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(u))); /* Pull down units which are bound to us recursively if enabled */ - UNIT_FOREACH_DEPENDENCY(other, u, UNIT_ATOM_RETROACTIVE_STOP_ON_STOP) /* BoundBy= */ + UNIT_FOREACH_DEPENDENCY_SAFE(other, u, UNIT_ATOM_RETROACTIVE_STOP_ON_STOP) /* BoundBy= */ if (!UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(other))) (void) manager_add_job(u->manager, JOB_STOP, other, JOB_REPLACE, /* error = */ NULL, /* ret = */ NULL); } @@ -2325,7 +2325,7 @@ void unit_start_on_termination_deps(Unit *u, UnitDependencyAtom atom) { assert(dependency_name); Unit *other; - UNIT_FOREACH_DEPENDENCY(other, u, atom) { + UNIT_FOREACH_DEPENDENCY_SAFE(other, u, atom) { _cleanup_(sd_bus_error_free) sd_bus_error error = SD_BUS_ERROR_NULL; if (n_jobs == 0) @@ -2348,7 +2348,7 @@ void unit_trigger_notify(Unit *u) { assert(u); - UNIT_FOREACH_DEPENDENCY(other, u, UNIT_ATOM_TRIGGERED_BY) + UNIT_FOREACH_DEPENDENCY_SAFE(other, u, UNIT_ATOM_TRIGGERED_BY) if (UNIT_VTABLE(other)->trigger_notify) UNIT_VTABLE(other)->trigger_notify(other, u); }