]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Prevent a shutdown race in catz_create_chg_task()
authorEvan Hunt <each@isc.org>
Tue, 4 Jan 2022 20:08:43 +0000 (12:08 -0800)
committerOndřej Surý <ondrej@isc.org>
Wed, 5 Jan 2022 11:48:40 +0000 (12:48 +0100)
If a catz event is scheduled while the task manager was being
shut down, task-exclusive mode is unavailable. This needs to be
handled as an error rather than triggering an assertion.

bin/named/server.c

index 8e27090da8580eaadcc6441b5cf8ee5107115b56..4e741cb3857690c2c8e2bd4d666582a56797c20b 100644 (file)
@@ -2902,11 +2902,16 @@ static isc_result_t
 catz_create_chg_task(dns_catz_entry_t *entry, dns_catz_zone_t *origin,
                     dns_view_t *view, isc_taskmgr_t *taskmgr, void *udata,
                     isc_eventtype_t type) {
-       catz_chgzone_event_t *event;
-       isc_task_t *task;
+       catz_chgzone_event_t *event = NULL;
+       isc_task_t *task = NULL;
        isc_result_t result;
        isc_taskaction_t action = NULL;
 
+       result = isc_taskmgr_excltask(taskmgr, &task);
+       if (result != ISC_R_SUCCESS) {
+               return (result);
+       }
+
        switch (type) {
        case DNS_EVENT_CATZADDZONE:
        case DNS_EVENT_CATZMODZONE:
@@ -2917,6 +2922,7 @@ catz_create_chg_task(dns_catz_entry_t *entry, dns_catz_zone_t *origin,
                break;
        default:
                REQUIRE(0);
+               ISC_UNREACHABLE();
        }
 
        event = (catz_chgzone_event_t *)isc_event_allocate(
@@ -2927,13 +2933,11 @@ catz_create_chg_task(dns_catz_entry_t *entry, dns_catz_zone_t *origin,
        event->origin = NULL;
        event->view = NULL;
        event->mod = (type == DNS_EVENT_CATZMODZONE);
+
        dns_catz_entry_attach(entry, &event->entry);
        dns_catz_zone_attach(origin, &event->origin);
        dns_view_attach(view, &event->view);
 
-       task = NULL;
-       result = isc_taskmgr_excltask(taskmgr, &task);
-       REQUIRE(result == ISC_R_SUCCESS);
        isc_task_send(task, ISC_EVENT_PTR(&event));
        isc_task_detach(&task);