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:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
@@ -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;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user