2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-09-01 06:55:30 +00:00

Refactor simple slabheader matching

Add a helper function both_headers() that unifies the slabheader
matching for simple type: it returns true when both the type and
the matching RRSIG have been found.
This commit is contained in:
Ondřej Surý
2025-02-02 20:07:42 +01:00
committed by Evan Hunt
parent 4cd1dd8dd7
commit cf66ba02a4

View File

@@ -1315,6 +1315,31 @@ check_stale_header(qpcnode_t *node, dns_slabheader_t *header,
return true; return true;
} }
static bool
both_headers(dns_slabheader_t *header, dns_rdatatype_t type,
dns_slabheader_t **foundp, dns_slabheader_t **foundsigp) {
dns_typepair_t matchtype = DNS_TYPEPAIR_VALUE(type, 0);
dns_typepair_t sigmatchtype = DNS_SIGTYPE(type);
if (!EXISTS(header) || ANCIENT(header)) {
return false;
}
if (header->type == matchtype) {
*foundp = header;
if (*foundsigp != NULL) {
return true;
}
} else if (header->type == sigmatchtype) {
*foundsigp = header;
if (*foundp != NULL) {
return true;
}
}
return false;
}
static isc_result_t static isc_result_t
check_zonecut(qpcnode_t *node, void *arg DNS__DB_FLARG) { check_zonecut(qpcnode_t *node, void *arg DNS__DB_FLARG) {
qpc_search_t *search = arg; qpc_search_t *search = arg;
@@ -1341,14 +1366,10 @@ check_zonecut(qpcnode_t *node, void *arg DNS__DB_FLARG) {
continue; continue;
} }
if (header->type == dns_rdatatype_dname && EXISTS(header) && if (both_headers(header, dns_rdatatype_dname, &dname_header,
!ANCIENT(header)) &sigdname_header))
{ {
dname_header = header; break;
} else if (header->type == DNS_SIGTYPE(dns_rdatatype_dname) &&
EXISTS(header) && !ANCIENT(header))
{
sigdname_header = header;
} }
} }
@@ -1414,24 +1435,10 @@ find_deepest_zonecut(qpc_search_t *search, qpcnode_t *node,
continue; continue;
} }
if (EXISTS(header) && !ANCIENT(header)) { if (both_headers(header, dns_rdatatype_ns, &found,
/* &foundsig))
* We've found an extant rdataset. See if {
* we're interested in it. break;
*/
if (header->type == dns_rdatatype_ns) {
found = header;
if (foundsig != NULL) {
break;
}
} else if (header->type ==
DNS_SIGTYPE(dns_rdatatype_ns))
{
foundsig = header;
if (found != NULL) {
break;
}
}
} }
} }
@@ -1487,7 +1494,6 @@ find_coveringnsec(qpc_search_t *search, const dns_name_t *name,
isc_result_t result; isc_result_t result;
isc_rwlocktype_t nlocktype = isc_rwlocktype_none; isc_rwlocktype_t nlocktype = isc_rwlocktype_none;
isc_rwlock_t *nlock = NULL; isc_rwlock_t *nlock = NULL;
dns_typepair_t matchtype, sigmatchtype;
dns_slabheader_t *found = NULL, *foundsig = NULL; dns_slabheader_t *found = NULL, *foundsig = NULL;
dns_slabheader_t *header = NULL; dns_slabheader_t *header = NULL;
dns_slabheader_t *header_next = NULL, *header_prev = NULL; dns_slabheader_t *header_next = NULL, *header_prev = NULL;
@@ -1503,8 +1509,6 @@ find_coveringnsec(qpc_search_t *search, const dns_name_t *name,
fname = dns_fixedname_initname(&fixed); fname = dns_fixedname_initname(&fixed);
predecessor = dns_fixedname_initname(&fpredecessor); predecessor = dns_fixedname_initname(&fpredecessor);
matchtype = DNS_TYPEPAIR_VALUE(dns_rdatatype_nsec, 0);
sigmatchtype = DNS_SIGTYPE(dns_rdatatype_nsec);
/* /*
* Extract predecessor from iterator. * Extract predecessor from iterator.
@@ -1535,19 +1539,13 @@ find_coveringnsec(qpc_search_t *search, const dns_name_t *name,
continue; continue;
} }
if (!EXISTS(header) || DNS_TYPEPAIR_TYPE(header->type) == 0) { if (DNS_TYPEPAIR_TYPE(header->type) == 0) {
continue; continue;
} }
if (header->type == matchtype) {
found = header; if (both_headers(header, dns_rdatatype_nsec, &found, &foundsig))
if (foundsig != NULL) { {
break; break;
}
} else if (header->type == sigmatchtype) {
foundsig = header;
if (found != NULL) {
break;
}
} }
} }
if (found != NULL) { if (found != NULL) {
@@ -2071,20 +2069,8 @@ qpcache_findzonecut(dns_db_t *db, const dns_name_t *name, unsigned int options,
continue; continue;
} }
if (EXISTS(header) && !ANCIENT(header)) { if (both_headers(header, dns_rdatatype_ns, &found, &foundsig)) {
if (header->type == dns_rdatatype_ns) { break;
found = header;
if (foundsig != NULL) {
break;
}
} else if (header->type ==
DNS_SIGTYPE(dns_rdatatype_ns))
{
foundsig = header;
if (found != NULL) {
break;
}
}
} }
} }
@@ -3024,11 +3010,11 @@ find_header:
newheader->heap = qpdb->buckets[idx].heap; newheader->heap = qpdb->buckets[idx].heap;
if (ZEROTTL(newheader)) { if (ZEROTTL(newheader)) {
newheader->last_used = qpdb->last_used + 1; newheader->last_used = qpdb->last_used + 1;
ISC_LIST_APPEND(qpdb->buckets[idx].lru, ISC_LIST_APPEND(qpdb->buckets[idx].lru, newheader,
newheader, link); link);
} else { } else {
ISC_LIST_PREPEND(qpdb->buckets[idx].lru, ISC_LIST_PREPEND(qpdb->buckets[idx].lru, newheader,
newheader, link); link);
} }
if (topheader_prev != NULL) { if (topheader_prev != NULL) {
topheader_prev->next = newheader; topheader_prev->next = newheader;