]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Decouple view->resolver and friends shutdown and detach
authorOndřej Surý <ondrej@isc.org>
Tue, 28 Feb 2023 13:14:06 +0000 (14:14 +0100)
committerOndřej Surý <ondrej@isc.org>
Tue, 28 Feb 2023 15:32:33 +0000 (15:32 +0000)
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

index 1dd0edce719b1f5554f678972eee915a0735cb55..1aeb5a85888a4fc9aa00c2a19d3f90f54de9a35c 100644 (file)
@@ -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);
                }