From dfd195e77c8ecab92c26aeaf5856e35fdf3bc7cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Sur=C3=BD?= Date: Tue, 28 Feb 2023 14:14:06 +0100 Subject: [PATCH] Decouple view->resolver and friends shutdown and detach In !7538, the shutdown procedure was simplified, but the ordering was wrong, we need to shutdown the resolver, adb and requestmgr before detaching those objects from the view, because there are cross dependencies between at least the resolver and the adb. Execute the shutdown(s) first, only when all three shutdowns have been executed, detach those objects from the view. --- lib/dns/view.c | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/lib/dns/view.c b/lib/dns/view.c index 1dd0edce71..1aeb5a8588 100644 --- a/lib/dns/view.c +++ b/lib/dns/view.c @@ -288,12 +288,12 @@ destroy(dns_view_t *view) { if (view->statickeys != NULL) { dns_tsigkeyring_detach(&view->statickeys); } - if (view->adb != NULL) { - dns_adb_detach(&view->adb); - } - if (view->resolver != NULL) { - dns_resolver_detach(&view->resolver); - } + + /* These must have been detached in dns_view_detach() */ + INSIST(view->adb == NULL); + INSIST(view->resolver == NULL); + INSIST(view->requestmgr == NULL); + dns_rrl_view_destroy(view); if (view->rpzs != NULL) { dns_rpz_shutdown_rpzs(view->rpzs); @@ -315,9 +315,6 @@ destroy(dns_view_t *view) { ISC_LIST_UNLINK(view->dlz_unsearched, dlzdb, link); dns_dlzdestroy(&dlzdb); } - if (view->requestmgr != NULL) { - dns_requestmgr_detach(&view->requestmgr); - } if (view->hints != NULL) { dns_db_detach(&view->hints); } @@ -513,20 +510,35 @@ dns_view_detach(dns_view_t **viewp) { isc_refcount_destroy(&view->references); + /* Shutdown the attached objects first */ + if (view->resolver != NULL) { + dns_resolver_shutdown(view->resolver); + } + if (view->adb != NULL) { + dns_adb_shutdown(view->adb); + } + if (view->requestmgr != NULL) { + dns_requestmgr_shutdown(view->requestmgr); + } + /* Swap the pointers under the lock */ LOCK(&view->lock); + if (view->resolver != NULL) { resolver = view->resolver; view->resolver = NULL; } + if (view->adb != NULL) { adb = view->adb; view->adb = NULL; } + if (view->requestmgr != NULL) { requestmgr = view->requestmgr; view->requestmgr = NULL; } + if (view->zonetable != NULL) { zt = view->zonetable; view->zonetable = NULL; @@ -559,17 +571,15 @@ dns_view_detach(dns_view_t **viewp) { /* 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); } + if (zt != NULL) { dns_zt_detach(&zt); }