From: Ondřej Surý Date: Fri, 27 Sep 2019 10:02:41 +0000 (+0200) Subject: lib/isc/task.c: Fix invalid order of DbC checks that could cause dereference before... X-Git-Tag: v9.15.6~72^2~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c662969da190dfa186d9357b2d4454b571c2ed1a;p=thirdparty%2Fbind9.git lib/isc/task.c: Fix invalid order of DbC checks that could cause dereference before NULL check --- diff --git a/lib/isc/task.c b/lib/isc/task.c index 1c44663f513..88e5fb1d830 100644 --- a/lib/isc/task.c +++ b/lib/isc/task.c @@ -1573,10 +1573,12 @@ isc_taskmgr_excltask(isc_taskmgr_t *mgr0, isc_task_t **taskp) { isc_result_t isc_task_beginexclusive(isc_task_t *task0) { isc__task_t *task = (isc__task_t *)task0; - isc__taskmgr_t *manager = task->manager; + isc__taskmgr_t *manager; REQUIRE(VALID_TASK(task)); + manager = task->manager; + REQUIRE(task->state == task_state_running); LOCK(&manager->excl_lock); @@ -1605,10 +1607,13 @@ isc_task_beginexclusive(isc_task_t *task0) { void isc_task_endexclusive(isc_task_t *task0) { isc__task_t *task = (isc__task_t *)task0; - isc__taskmgr_t *manager = task->manager; + isc__taskmgr_t *manager; REQUIRE(VALID_TASK(task)); REQUIRE(task->state == task_state_running); + + manager = task->manager; + LOCK(&manager->halt_lock); REQUIRE(atomic_load_relaxed(&manager->exclusive_req) == true); atomic_store_relaxed(&manager->exclusive_req, false);