From: dongshengyuan <545258830@qq.com> Date: Thu, 11 Jun 2026 07:14:49 +0000 (+0800) Subject: core: fix unit_merge() load state check evaluating after state overwrite X-Git-Tag: v261-rc4~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=98cae7a1251da111f01fd6e2bc2458f53445b15a;p=thirdparty%2Fsystemd.git core: fix unit_merge() load state check evaluating after state overwrite The condition on line 1206 checks other->load_state != UNIT_STUB to decide whether to call the vtable done() callback, but the state was already overwritten to UNIT_MERGED on line 1198, making the condition always true. Save the original load_state before overwriting it, so that units in UNIT_STUB state (which never went through a load attempt) correctly skip the done() call. Signed-off-by: dongshengyuan Co-developed-by: Claude Opus 4.8 (1M context) --- diff --git a/src/core/unit.c b/src/core/unit.c index 2205ad0e2bc..8684471d57e 100644 --- a/src/core/unit.c +++ b/src/core/unit.c @@ -1195,6 +1195,8 @@ int unit_merge(Unit *u, Unit *other) { if (r < 0) return r; + UnitLoadState saved_load_state = other->load_state; + other->load_state = UNIT_MERGED; other->merged_into = u; @@ -1203,7 +1205,7 @@ int unit_merge(Unit *u, Unit *other) { /* If there is still some data attached to the other node, we * don't need it anymore, and can free it. */ - if (other->load_state != UNIT_STUB) + if (saved_load_state != UNIT_STUB) if (UNIT_VTABLE(other)->done) UNIT_VTABLE(other)->done(other);