From: Ondřej Surý Date: Thu, 19 Jan 2023 08:14:53 +0000 (+0100) Subject: Detach the zone views outside of the zone lock X-Git-Tag: v9.19.10~30^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=978a0ef84cfb08435c1b7664c6328521b743fb02;p=thirdparty%2Fbind9.git Detach the zone views outside of the zone lock Detaching the views in the zone_shutdown() could lead to lock-order-inversion between adb->namelocks[bucket], adb->lock, view->lock and zone->lock. Detach the views outside of the section that zone-locked. --- diff --git a/lib/dns/zone.c b/lib/dns/zone.c index 411756d9cbe..9cf2bd49f75 100644 --- a/lib/dns/zone.c +++ b/lib/dns/zone.c @@ -14689,6 +14689,7 @@ zone_shutdown(void *arg) { dns_zone_t *zone = (dns_zone_t *)arg; bool free_needed, linked = false; dns_zone_t *raw = NULL, *secure = NULL; + dns_view_t *view = NULL, *prev_view = NULL; REQUIRE(DNS_ZONE_VALID(zone)); INSIST(isc_refcount_current(&zone->erefs) == 0); @@ -14734,13 +14735,15 @@ zone_shutdown(void *arg) { LOCK_ZONE(zone); INSIST(zone != zone->raw); - /* Detach the views early, we don't need them anymore */ - if (zone->view != NULL) { - dns_view_weakdetach(&zone->view); - } - if (zone->prev_view != NULL) { - dns_view_weakdetach(&zone->prev_view); - } + /* + * Detach the views early, we don't need them anymore. However, we need + * to detach them outside of the zone lock to break the lock loop + * between view, adb and zone locks. + */ + view = zone->view; + zone->view = NULL; + prev_view = zone->prev_view; + zone->prev_view = NULL; if (linked) { isc_refcount_decrement(&zone->irefs); @@ -14802,6 +14805,14 @@ zone_shutdown(void *arg) { zone->secure = NULL; } UNLOCK_ZONE(zone); + + if (view != NULL) { + dns_view_weakdetach(&view); + } + if (prev_view != NULL) { + dns_view_weakdetach(&prev_view); + } + if (raw != NULL) { dns_zone_detach(&raw); }