From: Oleksii Shevchuk Date: Wed, 13 Feb 2013 22:49:26 +0000 (+0200) Subject: unit: fix the race in deserialization. X-Git-Tag: v198~128 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=bf6dcfa6a79a459239799a21bdcba115d696a006;ds=sidebyside unit: fix the race in deserialization. unit_notify is fired in deserelization code (particulary in service_set_state). Units passed in random order, and there is possibility, that unit with StopWhenUnneeded=yes passed before it actual dependecies. In that case unit will be stopped as unneeded, because deps in UNIT_INACTIVE state yet. So, reuse similar logic (unit.c:1421) to avoid this race --- diff --git a/src/core/unit.c b/src/core/unit.c index e2c06ae8b..601be60ed 100644 --- a/src/core/unit.c +++ b/src/core/unit.c @@ -1517,7 +1517,8 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_su /* Maybe we finished startup and are now ready for being * stopped because unneeded? */ - unit_check_unneeded(u); + if (u->manager->n_reloading <= 0) + unit_check_unneeded(u); unit_add_to_dbus_queue(u); unit_add_to_gc_queue(u);