]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
"rndc freeze" could trigger an assertion in named when called on a
authorEvan Hunt <each@isc.org>
Tue, 13 May 2008 01:23:22 +0000 (01:23 +0000)
committerEvan Hunt <each@isc.org>
Tue, 13 May 2008 01:23:22 +0000 (01:23 +0000)
nonexistent zone. [rt18050]

CHANGES
lib/dns/view.c

diff --git a/CHANGES b/CHANGES
index 1cdf056f0a9de766ad413f20775e24b41366bf6c..45f9f74da98c6eed2c83ccc791c66b12d26273aa 100644 (file)
--- 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]
+
        --- 9.5.0rc1 released ---
 
 2368.   [port]          Linux: use libcap for capability management if
index 17966c21b8d0ae1a46546805f647f73849d6373c..361339a1e8499af9bc11c28dfb78ed044b3a1cd7 100644 (file)
@@ -15,7 +15,7 @@
  * PERFORMANCE OF THIS SOFTWARE.
  */
 
-/* $Id: view.c,v 1.143.128.3 2008/04/03 06:10:20 marka Exp $ */
+/* $Id: view.c,v 1.143.128.4 2008/05/13 01:23:22 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);