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)
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;