]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
4213. [bug] Don't reuse a cache across multiple classes.
authorMark Andrews <marka@isc.org>
Thu, 17 Sep 2015 04:51:21 +0000 (14:51 +1000)
committerMark Andrews <marka@isc.org>
Thu, 17 Sep 2015 04:51:21 +0000 (14:51 +1000)
                        [RT #40205]

CHANGES
bin/named/server.c
bin/tests/system/resolver/ns1/named.conf

diff --git a/CHANGES b/CHANGES
index 6198b5ba5d9c9113ac45aabb701b523415346ca5..22870258719352472f54ff6b25d8305b8af4a119 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+4213.  [bug]           Don't reuse a cache across multiple classes.
+                       [RT #40205]
+
 4212.  [func]          Re-query if we get a bad client cookie returned over
                        UDP. [RT #40748]
 
index 1a25531df354f6f0593bfb86e5aa3e3c9b9c80e5..734d11e48abaaf9da2b0dca39a0cf196c1bf2c8a 100644 (file)
@@ -210,6 +210,7 @@ struct ns_cache {
        dns_view_t                      *primaryview;
        isc_boolean_t                   needflush;
        isc_boolean_t                   adbsizeadjusted;
+       dns_rdataclass_t                rdclass;
        ISC_LINK(ns_cache_t)            link;
 };
 
@@ -1511,13 +1512,16 @@ setquerystats(dns_zone_t *zone, isc_mem_t *mctx, dns_zonestat_level_t level) {
 }
 
 static ns_cache_t *
-cachelist_find(ns_cachelist_t *cachelist, const char *cachename) {
+cachelist_find(ns_cachelist_t *cachelist, const char *cachename,
+              dns_rdataclass_t rdclass)
+{
        ns_cache_t *nsc;
 
        for (nsc = ISC_LIST_HEAD(*cachelist);
             nsc != NULL;
             nsc = ISC_LIST_NEXT(nsc, link)) {
-               if (strcmp(dns_cache_getname(nsc->cache), cachename) == 0)
+               if (nsc->rdclass == rdclass &&
+                   strcmp(dns_cache_getname(nsc->cache), cachename) == 0)
                        return (nsc);
        }
 
@@ -1528,7 +1532,8 @@ static isc_boolean_t
 cache_reusable(dns_view_t *originview, dns_view_t *view,
               isc_boolean_t new_zero_no_soattl)
 {
-       if (originview->checknames != view->checknames ||
+       if (originview->rdclass != view->rdclass ||
+           originview->checknames != view->checknames ||
            dns_resolver_getzeronosoattl(originview->resolver) !=
            new_zero_no_soattl ||
            originview->acceptexpired != view->acceptexpired ||
@@ -2879,7 +2884,7 @@ configure_view(dns_view_t *view, dns_viewlist_t *viewlist,
        else
                cachename = view->name;
        cache = NULL;
-       nsc = cachelist_find(cachelist, cachename);
+       nsc = cachelist_find(cachelist, cachename, view->rdclass);
        if (nsc != NULL) {
                if (!cache_sharable(nsc->primaryview, view, zero_no_soattl,
                                    cleaning_interval, max_cache_size)) {
@@ -2961,6 +2966,7 @@ configure_view(dns_view_t *view, dns_viewlist_t *viewlist,
                nsc->primaryview = view;
                nsc->needflush = ISC_FALSE;
                nsc->adbsizeadjusted = ISC_FALSE;
+               nsc->rdclass = view->rdclass;
                ISC_LINK_INIT(nsc, link);
                ISC_LIST_APPEND(*cachelist, nsc, link);
        }
index 645b10e8137237bc2816eea02b67c36ca7471745..53b1d2906ec7bdf04219fd7ec0c9e5ba1b3b91bc 100644 (file)
@@ -36,6 +36,7 @@ options {
                              "gooddname.example.net"; };
        allow-query {!10.53.0.8; any; };
        max-zone-ttl unlimited;
+       attach-cache "globalcache";
 };
 
 server 10.42.23.3/32 {
@@ -50,8 +51,21 @@ server fd92:7065:b8e:ffff::1000 {
      transfer-source-v6 fd92:7065:b8e:ffff::1001;
 };
 
-zone "." {
-       type hint;
-       file "root.hint";
+/*
+ * Must be first view so that there is a CH cache with name
+ * "globalcache" before the recursive "default"/IN view is configured.
+ */
+view "class" chaos {
+       match-clients { none; };
 };
 
+/*
+ * Must be second view so that so that we can check we don't attach to the
+ * "globalcache"/CH cache.
+ */
+view "default" {
+       zone "." {
+               type hint;
+               file "root.hint";
+       };
+};