From: Mark Andrews Date: Thu, 17 Sep 2015 04:51:21 +0000 (+1000) Subject: 4213. [bug] Don't reuse a cache across multiple classes. X-Git-Tag: v9.11.0a1~467 X-Git-Url: http://git.ipfire.org/gitweb/?a=commitdiff_plain;h=dd1bcab25cf91eccb77060023d94a306411f7f14;p=thirdparty%2Fbind9.git 4213. [bug] Don't reuse a cache across multiple classes. [RT #40205] --- diff --git a/CHANGES b/CHANGES index 6198b5ba5d9..22870258719 100644 --- 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] diff --git a/bin/named/server.c b/bin/named/server.c index 1a25531df35..734d11e48ab 100644 --- a/bin/named/server.c +++ b/bin/named/server.c @@ -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); } diff --git a/bin/tests/system/resolver/ns1/named.conf b/bin/tests/system/resolver/ns1/named.conf index 645b10e8137..53b1d2906ec 100644 --- a/bin/tests/system/resolver/ns1/named.conf +++ b/bin/tests/system/resolver/ns1/named.conf @@ -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"; + }; +};