mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-08-31 14:35:26 +00:00
Bound the amount of work performed for delegations
Limit the amount of database lookups that can be triggered in fctx_getaddresses() (i.e. when determining the name server addresses to query next) by setting a hard limit on the number of NS RRs processed for any delegation encountered. Without any limit in place, named can be forced to perform large amounts of database lookups per each query received, which severely impacts resolver performance. The limit used (20) is an arbitrary value that is considered to be big enough for any sane DNS delegation.
This commit is contained in:
@@ -214,6 +214,17 @@
|
||||
*/
|
||||
#define NS_FAIL_LIMIT 4
|
||||
#define NS_RR_LIMIT 5
|
||||
/*
|
||||
* IP address lookups are performed for at most NS_PROCESSING_LIMIT NS RRs in
|
||||
* any NS RRset encountered, to avoid excessive resource use while processing
|
||||
* large delegations.
|
||||
*/
|
||||
#define NS_PROCESSING_LIMIT 20
|
||||
|
||||
STATIC_ASSERT(NS_PROCESSING_LIMIT > NS_RR_LIMIT,
|
||||
"The maximum number of NS RRs processed for each delegation "
|
||||
"(NS_PROCESSING_LIMIT) must be larger than the large delegation "
|
||||
"threshold (NS_RR_LIMIT).");
|
||||
|
||||
/* Hash table for zone counters */
|
||||
#ifndef RES_DOMAIN_HASH_BITS
|
||||
@@ -3536,6 +3547,7 @@ fctx_getaddresses(fetchctx_t *fctx, bool badcache) {
|
||||
bool need_alternate = false;
|
||||
bool all_spilled = true;
|
||||
unsigned int no_addresses = 0;
|
||||
unsigned int ns_processed = 0;
|
||||
|
||||
FCTXTRACE5("getaddresses", "fctx->depth=", fctx->depth);
|
||||
|
||||
@@ -3726,6 +3738,11 @@ normal_nses:
|
||||
|
||||
dns_rdata_reset(&rdata);
|
||||
dns_rdata_freestruct(&ns);
|
||||
|
||||
if (++ns_processed >= NS_PROCESSING_LIMIT) {
|
||||
result = ISC_R_NOMORE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (result != ISC_R_NOMORE) {
|
||||
return (result);
|
||||
|
Reference in New Issue
Block a user