From d6de4edc412f594a44df0d3065809de4aa1e4996 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Sur=C3=BD?= Date: Fri, 27 Sep 2019 12:02:41 +0200 Subject: [PATCH] lib/isc/task.c: Fix invalid order of DbC checks that could cause dereference before NULL check (cherry picked from commit c662969da190dfa186d9357b2d4454b571c2ed1a) --- lib/isc/task.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/isc/task.c b/lib/isc/task.c index 8d6d409d35..e823a177f5 100644 --- a/lib/isc/task.c +++ b/lib/isc/task.c @@ -1570,10 +1570,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); @@ -1602,10 +1604,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);