]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Add extra checks for !ANCIENT(header)
authorMatthijs Mekking <matthijs@isc.org>
Tue, 10 Aug 2021 10:18:12 +0000 (12:18 +0200)
committerMatthijs Mekking <matthijs@isc.org>
Fri, 13 Aug 2021 07:42:34 +0000 (09:42 +0200)
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

index 98df4377c2232103c86e7b6478cc99bb400f5684..bfca24a5b9e167ba303c5eed72f6195113a4343d 100644 (file)
@@ -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.