From 4cbbeae1aae525ed5113f4cb783ef9ecfc34535a Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Thu, 17 Sep 2015 14:51:21 +1000 Subject: [PATCH] 4213. [bug] Don't reuse a cache across multiple classes. [RT #40205] (cherry picked from commit dd1bcab25cf91eccb77060023d94a306411f7f14) --- CHANGES | 3 +++ bin/named/server.c | 14 ++++++++++---- bin/tests/system/resolver/ns1/named.conf | 20 +++++++++++++++++--- 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/CHANGES b/CHANGES index be42c66b9c..171c6bae65 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ +4213. [bug] Don't reuse a cache across multiple classes. + [RT #40205] + 4210. [cleanup] Silence use after free false positive. [RT #40743] 4208. [bug] Address null pointer dereferences on out of memory. diff --git a/bin/named/server.c b/bin/named/server.c index d7d1a59fc1..968a81b0f1 100644 --- a/bin/named/server.c +++ b/bin/named/server.c @@ -188,6 +188,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; }; @@ -1388,13 +1389,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); } @@ -1405,7 +1409,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 || @@ -2595,7 +2600,7 @@ configure_view(dns_view_t *view, cfg_obj_t *config, cfg_obj_t *vconfig, 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)) { @@ -2677,6 +2682,7 @@ configure_view(dns_view_t *view, cfg_obj_t *config, cfg_obj_t *vconfig, 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 e7067ec6d4..0a440052ad 100644 --- a/bin/tests/system/resolver/ns1/named.conf +++ b/bin/tests/system/resolver/ns1/named.conf @@ -35,6 +35,7 @@ options { except-from { "goodcname.example.net"; "gooddname.example.net"; }; allow-query {!10.53.0.8; any; }; + attach-cache "globalcache"; }; server 10.42.23.3/32 { @@ -49,8 +50,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"; + }; +};