From e1c4e29b1b4fca20743df44796d61adcaa399ca2 Mon Sep 17 00:00:00 2001 From: Tony Finch Date: Tue, 28 Feb 2023 12:57:29 +0000 Subject: [PATCH] Revert !7538, simplify locking in dns_view_detach() This reverts commit eb6b31b6, which led to a null pointer dereference in adb when the resolver tried to use it after it was detached. Closes #3898 --- lib/dns/view.c | 38 +++++++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/lib/dns/view.c b/lib/dns/view.c index 0cf2a4802e..d26e9d0e37 100644 --- a/lib/dns/view.c +++ b/lib/dns/view.c @@ -518,15 +518,36 @@ dns_view_detach(dns_view_t **viewp) { if (view->resolver != NULL) { resolver = view->resolver; view->resolver = NULL; + UNLOCK(&view->lock); + + dns_resolver_shutdown(resolver); + dns_resolver_detach(&resolver); + + LOCK(&view->lock); } + if (view->adb != NULL) { adb = view->adb; view->adb = NULL; + UNLOCK(&view->lock); + + dns_adb_shutdown(adb); + dns_adb_detach(&adb); + + LOCK(&view->lock); } + if (view->requestmgr != NULL) { requestmgr = view->requestmgr; view->requestmgr = NULL; + UNLOCK(&view->lock); + + dns_requestmgr_shutdown(requestmgr); + dns_requestmgr_detach(&requestmgr); + + LOCK(&view->lock); } + if (view->zonetable != NULL) { zt = view->zonetable; view->zonetable = NULL; @@ -534,6 +555,7 @@ dns_view_detach(dns_view_t **viewp) { dns_zt_flush(zt); } } + if (view->managed_keys != NULL) { mkzone = view->managed_keys; view->managed_keys = NULL; @@ -557,25 +579,15 @@ dns_view_detach(dns_view_t **viewp) { } UNLOCK(&view->lock); - /* Detach outside view lock */ - if (resolver != NULL) { - dns_resolver_shutdown(resolver); - dns_resolver_detach(&resolver); - } - if (adb != NULL) { - dns_adb_shutdown(adb); - dns_adb_detach(&adb); - } - if (requestmgr != NULL) { - dns_requestmgr_shutdown(requestmgr); - dns_requestmgr_detach(&requestmgr); - } + /* Need to detach zt and zones outside view lock */ if (zt != NULL) { dns_zt_detach(&zt); } + if (mkzone != NULL) { dns_zone_detach(&mkzone); } + if (rdzone != NULL) { dns_zone_detach(&rdzone); }