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 <dongshengyuan@uniontech.com>
Co-developed-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
dongshengyuan
2026-06-16 15:43:37 +01:00
committed by Luca Boccassi
parent a77838a950
commit 98cae7a125
+3 -1
View File
@@ -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);