]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Don't destroy mctx and task pools until we are destroying zonemgr
authorOndřej Surý <ondrej@isc.org>
Thu, 7 Apr 2022 13:40:38 +0000 (15:40 +0200)
committerOndřej Surý <ondrej@isc.org>
Thu, 7 Apr 2022 16:12:03 +0000 (18:12 +0200)
The mctx, zonetask and loadtask pools were being destroyed in the
shutdown function where in theory a dangling zone could be still
attached to it.

Move the isc_mem_put() on the pools to the destroy() function.

lib/dns/zone.c

index 2ce42fcecac9bf34c37fe1f5fbc55ec81df52114..76f6a01eefd5b1ac43056dab5d79d18baf17e6dc 100644 (file)
@@ -19139,24 +19139,18 @@ dns_zonemgr_shutdown(dns_zonemgr_t *zmgr) {
        for (size_t i = 0; i < zmgr->workers; i++) {
                isc_mem_detach(&zmgr->mctxpool[i]);
        }
-       isc_mem_put(zmgr->mctx, zmgr->mctxpool,
-                   zmgr->workers * sizeof(zmgr->mctxpool[0]));
 
        for (size_t i = 0; i < zmgr->workers; i++) {
                if (zmgr->loadtasks[i] != NULL) {
                        isc_task_detach(&zmgr->loadtasks[i]);
                }
        }
-       isc_mem_put(zmgr->mctx, zmgr->loadtasks,
-                   zmgr->workers * sizeof(zmgr->loadtasks[0]));
 
        for (size_t i = 0; i < zmgr->workers; i++) {
                if (zmgr->zonetasks[i] != NULL) {
                        isc_task_detach(&zmgr->zonetasks[i]);
                }
        }
-       isc_mem_put(zmgr->mctx, zmgr->zonetasks,
-                   zmgr->workers * sizeof(zmgr->zonetasks[0]));
 
        RWLOCK(&zmgr->rwlock, isc_rwlocktype_read);
        for (zone = ISC_LIST_HEAD(zmgr->zones); zone != NULL;
@@ -19185,6 +19179,13 @@ zonemgr_free(dns_zonemgr_t *zmgr) {
        isc_ratelimiter_detach(&zmgr->startupnotifyrl);
        isc_ratelimiter_detach(&zmgr->startuprefreshrl);
 
+       isc_mem_put(zmgr->mctx, zmgr->mctxpool,
+                   zmgr->workers * sizeof(zmgr->mctxpool[0]));
+       isc_mem_put(zmgr->mctx, zmgr->loadtasks,
+                   zmgr->workers * sizeof(zmgr->loadtasks[0]));
+       isc_mem_put(zmgr->mctx, zmgr->zonetasks,
+                   zmgr->workers * sizeof(zmgr->zonetasks[0]));
+
        isc_rwlock_destroy(&zmgr->urlock);
        isc_rwlock_destroy(&zmgr->rwlock);