Don't destroy mctx and task pools until we are destroying zonemgr

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.
This commit is contained in:
Ondřej Surý 2022-04-07 15:40:38 +02:00
parent e58d8f2acb
commit f981b52793

View 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);