From: Evan Hunt Date: Tue, 13 May 2008 01:20:24 +0000 (+0000) Subject: "rndc freeze" could trigger an assertion in named when called on a X-Git-Tag: v9.3.6b1~131^2~57 X-Git-Url: http://git.ipfire.org/gitweb/?a=commitdiff_plain;h=c72279e756e6578dc8f09ceac5158d80a8a61ce5;p=thirdparty%2Fbind9.git "rndc freeze" could trigger an assertion in named when called on a nonexistent zone. [rt18050] --- diff --git a/CHANGES b/CHANGES index bb524883f81..68267b0232d 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ +2370. [bug] "rndc freeze" could trigger an assertion in named + when called on a nonexistent zone. [RT #18050] + 2369. [bug] libbind: Array bounds overrun on read in bitncmp(). [RT #18054] diff --git a/lib/dns/view.c b/lib/dns/view.c index cd740c79efa..ba8124b790d 100644 --- a/lib/dns/view.c +++ b/lib/dns/view.c @@ -15,7 +15,7 @@ * PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: view.c,v 1.146 2008/04/03 05:55:52 marka Exp $ */ +/* $Id: view.c,v 1.147 2008/05/13 01:20:24 each Exp $ */ /*! \file */ @@ -1161,6 +1161,7 @@ dns_viewlist_findzone(dns_viewlist_t *list, dns_name_t *name, dns_view_t *view; isc_result_t result; dns_zone_t *zone1 = NULL, *zone2 = NULL; + dns_zone_t **zp = NULL;; REQUIRE(list != NULL); for (view = ISC_LIST_HEAD(*list); @@ -1168,9 +1169,23 @@ dns_viewlist_findzone(dns_viewlist_t *list, dns_name_t *name, view = ISC_LIST_NEXT(view, link)) { if (allclasses == ISC_FALSE && view->rdclass != rdclass) continue; - result = dns_zt_find(view->zonetable, name, 0, NULL, - (zone1 == NULL) ? &zone1 : &zone2); - INSIST(result == ISC_R_SUCCESS || result == ISC_R_NOTFOUND); + + /* + * If the zone is defined in more than one view, + * treat it as not found. + */ + zp = (zone1 == NULL) ? &zone1 : &zone2; + result = dns_zt_find(view->zonetable, name, 0, NULL, zp); + INSIST(result == ISC_R_SUCCESS || + result == ISC_R_NOTFOUND || + result == DNS_R_PARTIALMATCH); + + /* Treat a partial match as no match */ + if (result == DNS_R_PARTIALMATCH) { + dns_zone_detach(zp); + result = ISC_R_NOTFOUND; + } + if (zone2 != NULL) { dns_zone_detach(&zone1); dns_zone_detach(&zone2);