diff --git a/bin/tests/system/resolver/tests.sh b/bin/tests/system/resolver/tests.sh index d9f2ab6f7a..65ef9b928b 100755 --- a/bin/tests/system/resolver/tests.sh +++ b/bin/tests/system/resolver/tests.sh @@ -482,10 +482,10 @@ dig_with_opts @10.53.0.5 fetchall.tld any >dig.out.2.${n} || ret=1 ttl2=$(awk '/"A" "short" "ttl"/ { print $2 }' dig.out.2.${n}) sleep 1 # check that prefetch occurred; -# note that only one record is prefetched, which is the TXT record in this case, +# note that only one record is prefetched, which is the AAAA record in this case, # because of the order of the records in the cache dig_with_opts @10.53.0.5 fetchall.tld any >dig.out.3.${n} || ret=1 -ttl3=$(awk '/"A" "short" "ttl"/ { print $2 }' dig.out.3.${n}) +ttl3=$(awk '/::1/ { print $2 }' dig.out.3.${n}) test "${ttl3:-0}" -gt "${ttl2:-1}" || ret=1 if [ $ret != 0 ]; then echo_i "failed"; fi status=$((status + ret)) diff --git a/lib/dns/rbtdb.c b/lib/dns/rbtdb.c index 3169ebb6ee..7b2df98ca7 100644 --- a/lib/dns/rbtdb.c +++ b/lib/dns/rbtdb.c @@ -2391,7 +2391,7 @@ dns__rbtdb_allrdatasets(dns_db_t *db, dns_dbnode_t *node, static bool cname_and_other_data(dns_rbtnode_t *node, uint32_t serial) { dns_slabheader_t *header = NULL, *header_next = NULL; - bool cname, other_data; + bool cname = false, other_data = false; dns_rdatatype_t rdtype; /* @@ -2401,10 +2401,16 @@ cname_and_other_data(dns_rbtnode_t *node, uint32_t serial) { /* * Look for CNAME and "other data" rdatasets active in our version. */ - cname = false; - other_data = false; for (header = node->data; header != NULL; header = header_next) { header_next = header->next; + if (!prio_type(header->type)) { + /* + * CNAME is in the priority list, so if we are done + * with the priority list, we know there will not be + * CNAME, so we are safe to skip the rest of the types. + */ + return (false); + } if (header->type == dns_rdatatype_cname) { /* * Look for an active extant CNAME. @@ -2464,10 +2470,9 @@ cname_and_other_data(dns_rbtnode_t *node, uint32_t serial) { } } } - } - - if (cname && other_data) { - return (true); + if (cname && other_data) { + return (true); + } } return (false);