From 28bb419edcaaaaeea67e4332de8aea0078adf3d7 Mon Sep 17 00:00:00 2001 From: Aram Sargsyan Date: Tue, 4 Jul 2023 08:38:39 +0000 Subject: [PATCH] Add shutdown checks in dns_catz_dbupdate_callback() 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. --- lib/dns/catz.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/lib/dns/catz.c b/lib/dns/catz.c index 4dfa2fac3e..c58b727de0 100644 --- a/lib/dns/catz.c +++ b/lib/dns/catz.c @@ -2137,9 +2137,17 @@ dns_catz_dbupdate_callback(dns_db_t *db, void *fn_arg) { REQUIRE(DNS_CATZ_ZONES_VALID(fn_arg)); catzs = (dns_catz_zones_t *)fn_arg; + 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;