]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Add shutdown checks in dns_catz_dbupdate_callback()
authorAram Sargsyan <aram@isc.org>
Tue, 4 Jul 2023 08:38:39 +0000 (08:38 +0000)
committerAram Sargsyan <aram@isc.org>
Thu, 6 Jul 2023 11:27:45 +0000 (11:27 +0000)
When a zone database update callback is called, the 'catzs' object,
extracted from the callback argument, might be already shutting down,
in which case the 'catzs->zones' can be NULL and cause an assertion
failure when calling isc_ht_find().

Add an early return from the callback if 'catzs->shuttingdown' is true.

Also check the validity of 'catzs->zones' after locking 'catzs' in
case there is a race with dns_catz_shutdown_catzs() running in another
thread.

(cherry picked from commit 28bb419edcaaaaeea67e4332de8aea0078adf3d7)

lib/dns/catz.c

index f790cdc0cf82781e6c59ecfb2f03f92eb843a23b..b18459eef91b72a1edb922b5dfc7e9edf8d2ae90 100644 (file)
@@ -2137,9 +2137,17 @@ dns_catz_dbupdate_callback(dns_db_t *db, void *fn_arg) {
        REQUIRE(DNS_DB_VALID(db));
        REQUIRE(DNS_CATZ_ZONES_VALID(catzs));
 
+       if (atomic_load(&catzs->shuttingdown)) {
+               return (ISC_R_SHUTTINGDOWN);
+       }
+
        dns_name_toregion(&db->origin, &r);
 
        LOCK(&catzs->lock);
+       if (catzs->zones == NULL) {
+               result = ISC_R_SHUTTINGDOWN;
+               goto cleanup;
+       }
        result = isc_ht_find(catzs->zones, r.base, r.length, (void **)&catz);
        if (result != ISC_R_SUCCESS) {
                goto cleanup;