2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-08-31 22:45:39 +00:00

Fix "CNAME and other data" detection

prio_type was being used in the wrong place to optimize cname_and_other.
We have to first exclude and accepted types and we also have to
determine that the record exists before we can check if we are at
a point where a later CNAME cannot appear.

(cherry picked from commit 5e49a9e4ae)
This commit is contained in:
Mark Andrews
2025-01-31 09:09:33 +11:00
parent 5fb68149a0
commit ae3e67717c
2 changed files with 19 additions and 17 deletions

View File

@@ -1657,15 +1657,6 @@ cname_and_other(qpznode_t *node, uint32_t serial) {
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 priority types, we know there will not be a
* CNAME, and are safe to skip the rest.
*/
return false;
}
rdtype = DNS_TYPEPAIR_TYPE(header->type);
if (rdtype == dns_rdatatype_cname) {
do {
@@ -1697,6 +1688,15 @@ cname_and_other(qpznode_t *node, uint32_t serial) {
header = header->down;
} while (header != NULL);
if (header != NULL) {
if (!prio_type(header->type)) {
/*
* CNAME is in the priority list, so if
* we are done with priority types, we
* know there will not be a CNAME, and
* are safe to skip the rest.
*/
return cname;
}
other = true;
}
}

View File

@@ -2418,14 +2418,6 @@ cname_and_other_data(dns_rbtnode_t *node, uint32_t serial) {
*/
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.
@@ -2481,6 +2473,16 @@ cname_and_other_data(dns_rbtnode_t *node, uint32_t serial) {
}
} while (header != NULL);
if (header != NULL) {
if (!prio_type(header->type)) {
/*
* CNAME is in the priority
* list, so if we are done with
* priority types, we know there
* will not be a CNAME, and are
* safe to skip the rest.
*/
return cname;
}
other_data = true;
}
}