From bf6651e27d456817bd110ddf6ec968b44403c643 Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Thu, 5 Apr 2012 15:48:43 +1000 Subject: [PATCH] 3303. [bug] named could die when reloading. [RT #28606] --- CHANGES | 2 ++ bin/named/server.c | 21 ++++++++++++++++----- lib/dns/zt.c | 4 ++-- 3 files changed, 20 insertions(+), 7 deletions(-) diff --git a/CHANGES b/CHANGES index 5dfe715e70..dc6e4ae841 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,5 @@ +3303. [bug] named could die when reloading. [RT #28606] + 3302. [bug] dns_dnssec_findmatchingkeys could fail to find keys if the zone name contained character that required special mappings. [RT #28600] diff --git a/bin/named/server.c b/bin/named/server.c index 7c791f7b41..b4e6036914 100644 --- a/bin/named/server.c +++ b/bin/named/server.c @@ -5273,17 +5273,28 @@ load_zones(ns_server_t *server) { view != NULL; view = ISC_LIST_NEXT(view, link)) { - if (view->managed_keys != NULL) - CHECK(dns_zone_load(view->managed_keys)); - if (view->redirect != NULL) - CHECK(dns_zone_load(view->redirect)); + if (view->managed_keys != NULL) { + result = dns_zone_load(view->managed_keys); + if (result != ISC_R_SUCCESS && result != DNS_R_UPTODATE) + goto cleanup; + } + if (view->redirect != NULL) { + result = dns_zone_load(view->redirect); + if (result != ISC_R_SUCCESS && result != DNS_R_UPTODATE) + goto cleanup; + } + + /* + * 'dns_view_asyncload' calls view_loaded if there are no + * zones. + */ isc_refcount_increment(&zl->refs, NULL); CHECK(dns_view_asyncload(view, view_loaded, zl)); } cleanup: isc_refcount_decrement(&zl->refs, &refs); - if (result != ISC_R_SUCCESS || refs == 0) { + if (refs == 0) { isc_refcount_destroy(&zl->refs); isc_mem_put(server->mctx, zl, sizeof (*zl)); } else { diff --git a/lib/dns/zt.c b/lib/dns/zt.c index 68cae251fa..5bb4cb8b5b 100644 --- a/lib/dns/zt.c +++ b/lib/dns/zt.c @@ -266,7 +266,7 @@ load(dns_zone_t *zone, void *uap) { isc_result_t dns_zt_asyncload(dns_zt_t *zt, dns_zt_allloaded_t alldone, void *arg) { - isc_result_t result, tresult; + isc_result_t result; static dns_zt_zoneloaded_t dl = doneloading; int pending; @@ -276,7 +276,7 @@ dns_zt_asyncload(dns_zt_t *zt, dns_zt_allloaded_t alldone, void *arg) { INSIST(zt->loads_pending == 0); - result = dns_zt_apply2(zt, ISC_FALSE, &tresult, asyncload, &dl); + result = dns_zt_apply2(zt, ISC_FALSE, NULL, asyncload, &dl); pending = zt->loads_pending; if (pending != 0) {