From e2d48968647b520d4d54972ec7cd7581cb548c0d Mon Sep 17 00:00:00 2001 From: Matthijs Mekking Date: Tue, 10 Aug 2021 12:18:12 +0200 Subject: [PATCH] Add extra checks for !ANCIENT(header) There are some occurrences where we check if a header exists in the rbtdb. These cases require that the header is also not marked as ancient (aka ready for cleanup). These cases involve finding certain data in cache. --- lib/dns/rbtdb.c | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/lib/dns/rbtdb.c b/lib/dns/rbtdb.c index 98df4377c2..bfca24a5b9 100644 --- a/lib/dns/rbtdb.c +++ b/lib/dns/rbtdb.c @@ -3523,7 +3523,9 @@ find_wildcard(rbtdb_search_t *search, dns_rbtnode_t **nodep, for (header = node->data; header != NULL; header = header->next) { if (header->serial <= search->serial && - !IGNORE(header) && EXISTS(header)) { + !IGNORE(header) && EXISTS(header) && + !ANCIENT(header)) + { break; } } @@ -3582,7 +3584,9 @@ find_wildcard(rbtdb_search_t *search, dns_rbtnode_t **nodep, for (header = wnode->data; header != NULL; header = header->next) { if (header->serial <= search->serial && - !IGNORE(header) && EXISTS(header)) { + !IGNORE(header) && EXISTS(header) && + !ANCIENT(header)) + { break; } } @@ -4677,11 +4681,13 @@ cache_zonecut_callback(dns_rbtnode_t *node, dns_name_t *name, void *arg) { &header_prev)) { /* Do nothing. */ } else if (header->type == dns_rdatatype_dname && - EXISTS(header)) { + EXISTS(header) && !ANCIENT(header)) + { dname_header = header; header_prev = header; } else if (header->type == RBTDB_RDATATYPE_SIGDNAME && - EXISTS(header)) { + EXISTS(header) && !ANCIENT(header)) + { sigdname_header = header; header_prev = header; } else { @@ -4751,7 +4757,7 @@ find_deepest_zonecut(rbtdb_search_t *search, dns_rbtnode_t *node, if (check_stale_header(node, header, &locktype, lock, search, &header_prev)) { /* Do nothing. */ - } else if (EXISTS(header)) { + } else if (EXISTS(header) && !ANCIENT(header)) { /* * We've found an extant rdataset. See if * we're interested in it. @@ -5373,7 +5379,7 @@ cache_findzonecut(dns_db_t *db, const dns_name_t *name, unsigned int options, if (check_stale_header(node, header, &locktype, lock, &search, &header_prev)) { /* Do nothing. */ - } else if (EXISTS(header)) { + } else if (EXISTS(header) && !ANCIENT(header)) { /* * If we found a type we were looking for, remember * it.