From d48f5e253fd3a09f3cd9dc1bfbb6ee6291f1a18a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ondr=CC=8Cej=20Sury=CC=81?= Date: Tue, 3 Jan 2023 10:33:23 +0100 Subject: [PATCH] Don't cleanup uninitialized dns_resolver buckets If the isc_task_create_bound() fails in the middle of buckets initialization - the most common case would be shutdown initialized during reload, not all tasks would be initialized, but the cleanup code would try to cleanup all buckets. Make sure that we cleanup only the initialized buckets by setting ntasks to the number of already initialized tasks on the error path. --- lib/dns/resolver.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/dns/resolver.c b/lib/dns/resolver.c index 1b6a8894e8..0c737e40f5 100644 --- a/lib/dns/resolver.c +++ b/lib/dns/resolver.c @@ -10378,7 +10378,7 @@ dns_resolver_create(dns_view_t *view, isc_taskmgr_t *taskmgr, .querydscp4 = -1, .querydscp6 = -1 }; - atomic_init(&res->activebuckets, ntasks); + atomic_init(&res->activebuckets, res->nbuckets); isc_mem_attach(view->mctx, &res->mctx); @@ -10399,12 +10399,12 @@ dns_resolver_create(dns_view_t *view, isc_taskmgr_t *taskmgr, } if (view->resstats != NULL) { - isc_stats_set(view->resstats, ntasks, + isc_stats_set(view->resstats, res->nbuckets, dns_resstatscounter_buckets); } res->buckets = isc_mem_get(view->mctx, - ntasks * sizeof(res->buckets[0])); + res->nbuckets * sizeof(res->buckets[0])); for (uint32_t i = 0; i < ntasks; i++) { res->buckets[i] = (fctxbucket_t){ 0 }; @@ -10417,6 +10417,7 @@ dns_resolver_create(dns_view_t *view, isc_taskmgr_t *taskmgr, result = isc_task_create_bound(taskmgr, 0, &res->buckets[i].task, i); if (result != ISC_R_SUCCESS) { + ntasks = i; isc_mutex_destroy(&res->buckets[i].lock); goto cleanup_buckets; }