summaryrefslogtreecommitdiff
path: root/iterator/iter_scrub.c
diff options
context:
space:
mode:
Diffstat (limited to 'iterator/iter_scrub.c')
-rw-r--r--iterator/iter_scrub.c45
1 files changed, 38 insertions, 7 deletions
diff --git a/iterator/iter_scrub.c b/iterator/iter_scrub.c
index f038ad69af0e..49a5f5da19c2 100644
--- a/iterator/iter_scrub.c
+++ b/iterator/iter_scrub.c
@@ -443,7 +443,7 @@ scrub_normalize(sldns_buffer* pkt, struct msg_parse* msg,
prev = NULL;
rrset = msg->rrset_first;
while(rrset && rrset->section == LDNS_SECTION_ANSWER) {
- if(cname_length > 11 /* env->cfg.iter_scrub_cname */) {
+ if(cname_length > env->cfg->iter_scrub_cname) {
/* Too many CNAMEs, or DNAMEs, from the authority
* server, scrub down the length to something
* shorter. This deletes everything after the limit
@@ -562,8 +562,8 @@ scrub_normalize(sldns_buffer* pkt, struct msg_parse* msg,
dname_pkt_compare(pkt, oldsname,
rrset->dname) == 0) {
if(rrset->type == LDNS_RR_TYPE_NS &&
- rrset->rr_count > 20 /* env->cfg->iter_scrub_ns */) {
- shorten_rrset(pkt, rrset, 20 /* env->cfg->iter_scrub_ns */);
+ rrset->rr_count > env->cfg->iter_scrub_ns) {
+ shorten_rrset(pkt, rrset, env->cfg->iter_scrub_ns);
}
prev = rrset;
rrset = rrset->rrset_all_next;
@@ -581,8 +581,8 @@ scrub_normalize(sldns_buffer* pkt, struct msg_parse* msg,
}
if(rrset->type == LDNS_RR_TYPE_NS &&
- rrset->rr_count > 20 /* env->cfg->iter_scrub_ns */) {
- shorten_rrset(pkt, rrset, 20 /* env->cfg->iter_scrub_ns */);
+ rrset->rr_count > env->cfg->iter_scrub_ns) {
+ shorten_rrset(pkt, rrset, env->cfg->iter_scrub_ns);
}
/* Mark the additional names from relevant rrset as OK. */
@@ -641,7 +641,7 @@ scrub_normalize(sldns_buffer* pkt, struct msg_parse* msg,
"RRset:", pkt, msg, prev, &rrset);
continue;
}
- if(rrset->rr_count > 20 /* env->cfg->iter_scrub_ns */) {
+ if(rrset->rr_count > env->cfg->iter_scrub_ns) {
/* If this is not a referral, and the NS RRset
* is signed, then remove it entirely, so
* that when it becomes bogus it does not
@@ -657,7 +657,7 @@ scrub_normalize(sldns_buffer* pkt, struct msg_parse* msg,
"RRset:", pkt, msg, prev, &rrset);
continue;
} else {
- shorten_rrset(pkt, rrset, 20 /* env->cfg->iter_scrub_ns */);
+ shorten_rrset(pkt, rrset, env->cfg->iter_scrub_ns);
}
}
}
@@ -871,6 +871,7 @@ scrub_sanitize(sldns_buffer* pkt, struct msg_parse* msg,
{
int del_addi = 0; /* if additional-holding rrsets are deleted, we
do not trust the normalized additional-A-AAAA any more */
+ uint8_t* ns_rrset_dname = NULL;
int added_rrlen_ede = 0;
struct rrset_parse* rrset, *prev;
prev = NULL;
@@ -976,6 +977,16 @@ scrub_sanitize(sldns_buffer* pkt, struct msg_parse* msg,
continue;
}
}
+ if(rrset->type == LDNS_RR_TYPE_NS &&
+ (rrset->section == LDNS_SECTION_AUTHORITY ||
+ rrset->section == LDNS_SECTION_ANSWER)) {
+ /* If the type is NS, and we're in the
+ * answer or authority section, then
+ * store the dname so we can check
+ * against the glue records
+ * further down */
+ ns_rrset_dname = rrset->dname;
+ }
if(del_addi && rrset->section == LDNS_SECTION_ADDITIONAL) {
remove_rrset("sanitize: removing potential "
"poison reference RRset:", pkt, msg, prev, &rrset);
@@ -988,6 +999,26 @@ scrub_sanitize(sldns_buffer* pkt, struct msg_parse* msg,
"RRset:", pkt, msg, prev, &rrset);
continue;
}
+ if(env->cfg->harden_unverified_glue && ns_rrset_dname &&
+ rrset->section == LDNS_SECTION_ADDITIONAL &&
+ (rrset->type == LDNS_RR_TYPE_A || rrset->type == LDNS_RR_TYPE_AAAA) &&
+ !pkt_strict_sub(pkt, rrset->dname, ns_rrset_dname)) {
+ /* We're in the additional section, looking
+ * at an A/AAAA rrset, have a previous
+ * delegation point and we notice that
+ * the glue records are NOT for strict
+ * subdomains of the delegation. So set a
+ * flag, recompute the hash for the rrset
+ * and write the A/AAAA record to cache.
+ * It'll be retrieved if we can't separately
+ * resolve the glue */
+ rrset->flags = PACKED_RRSET_UNVERIFIED_GLUE;
+ rrset->hash = pkt_hash_rrset(pkt, rrset->dname, rrset->type, rrset->rrset_class, rrset->flags);
+ store_rrset(pkt, msg, env, rrset);
+ remove_rrset("sanitize: storing potential "
+ "unverified glue reference RRset:", pkt, msg, prev, &rrset);
+ continue;
+ }
prev = rrset;
rrset = rrset->rrset_all_next;
}