From 46e7763d190d0a07e2b9eed93e2d36f95f6d1603 Mon Sep 17 00:00:00 2001 From: Evan Hunt Date: Wed, 17 Aug 2016 11:44:24 -0700 Subject: [PATCH] [master] check for STALE rdatasets in cache search 4446. [bug] The cache_find() and _findrdataset() functions could find rdatasets that had been marked stale. [RT #42853] --- CHANGES | 4 ++++ lib/dns/rbtdb.c | 42 +++++++++++++++++++++--------------------- 2 files changed, 25 insertions(+), 21 deletions(-) diff --git a/CHANGES b/CHANGES index 609d0c69e0..300c639b59 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,7 @@ +4446. [bug] The cache_find() and _findrdataset() functions + could find rdatasets that had been marked stale. + [RT #42853] + 4445. [cleanup] isc_errno_toresult() can now be used to call the formerly private function isc__errno2result(). [RT #43050] diff --git a/lib/dns/rbtdb.c b/lib/dns/rbtdb.c index 663cf18f6a..40bed4327c 100644 --- a/lib/dns/rbtdb.c +++ b/lib/dns/rbtdb.c @@ -163,7 +163,7 @@ typedef isc_uint64_t rbtdb_serial_t; #define cache_findrdataset cache_findrdataset64 #define cache_findzonecut cache_findzonecut64 #define cache_zonecut_callback cache_zonecut_callback64 -#define check_stale_rdataset check_stale_rdataset64 +#define check_stale_header check_stale_header64 #define cleanup_dead_nodes cleanup_dead_nodes64 #define cleanup_dead_nodes_callback cleanup_dead_nodes_callback64 #define closeversion closeversion64 @@ -4575,9 +4575,9 @@ zone_findzonecut(dns_db_t *db, dns_name_t *name, unsigned int options, } static isc_boolean_t -check_stale_rdataset(dns_rbtnode_t *node, rdatasetheader_t *header, - isc_rwlocktype_t *locktype, nodelock_t *lock, - rbtdb_search_t *search, rdatasetheader_t **header_prev) +check_stale_header(dns_rbtnode_t *node, rdatasetheader_t *header, + isc_rwlocktype_t *locktype, nodelock_t *lock, + rbtdb_search_t *search, rdatasetheader_t **header_prev) { #if !defined(ISC_RWLOCK_USEATOMIC) || !defined(DNS_RBT_USEISCREFCOUNT) @@ -4664,9 +4664,9 @@ cache_zonecut_callback(dns_rbtnode_t *node, dns_name_t *name, void *arg) { header_prev = NULL; for (header = node->data; header != NULL; header = header_next) { header_next = header->next; - if (check_stale_rdataset(node, header, - &locktype, lock, search, - &header_prev)) { + if (check_stale_header(node, header, + &locktype, lock, search, + &header_prev)) { /* Do nothing. */ } else if (header->type == dns_rdatatype_dname && EXISTS(header)) { @@ -4738,9 +4738,9 @@ find_deepest_zonecut(rbtdb_search_t *search, dns_rbtnode_t *node, header_prev = NULL; for (header = node->data; header != NULL; header = header_next) { header_next = header->next; - if (check_stale_rdataset(node, header, - &locktype, lock, search, - &header_prev)) { + if (check_stale_header(node, header, + &locktype, lock, search, + &header_prev)) { /* Do nothing. */ } else if (EXISTS(header)) { /* @@ -4875,9 +4875,9 @@ find_coveringnsec(rbtdb_search_t *search, dns_dbnode_t **nodep, header_prev = NULL; for (header = node->data; header != NULL; header = header_next) { header_next = header->next; - if (check_stale_rdataset(node, header, - &locktype, lock, search, - &header_prev)) { + if (check_stale_header(node, header, + &locktype, lock, search, + &header_prev)) { continue; } if (NONEXISTENT(header) || @@ -5060,11 +5060,11 @@ cache_find(dns_db_t *db, dns_name_t *name, dns_dbversion_t *version, header_prev = NULL; for (header = node->data; header != NULL; header = header_next) { header_next = header->next; - if (check_stale_rdataset(node, header, - &locktype, lock, &search, - &header_prev)) { + if (check_stale_header(node, header, + &locktype, lock, &search, + &header_prev)) { /* Do nothing. */ - } else if (EXISTS(header)) { + } else if (EXISTS(header) && (!STALE(header))) { /* * We now know that there is at least one active * non-stale rdataset at this node. @@ -5335,9 +5335,9 @@ cache_findzonecut(dns_db_t *db, dns_name_t *name, unsigned int options, header_prev = NULL; for (header = node->data; header != NULL; header = header_next) { header_next = header->next; - if (check_stale_rdataset(node, header, - &locktype, lock, &search, - &header_prev)) { + if (check_stale_header(node, header, + &locktype, lock, &search, + &header_prev)) { /* Do nothing. */ } else if (EXISTS(header)) { /* @@ -5809,7 +5809,7 @@ cache_findrdataset(dns_db_t *db, dns_dbnode_t *node, dns_dbversion_t *version, */ mark_stale_header(rbtdb, header); } - } else if (EXISTS(header)) { + } else if (EXISTS(header) && (!STALE(header))) { if (header->type == matchtype) found = header; else if (header->type == RBTDB_RDATATYPE_NCACHEANY || -- GitLab