static thread_local set<DNSName> t_rootNSZones;
+static void insertIntoRootNSZones(const DNSName &name) {
+ // do not insert dot, wiping dot's NS records from the cache in primeRootNSZones()
+ // will cause infinite recursion
+ if (!name.isRoot()) {
+ t_rootNSZones.insert(name);
+ }
+}
+
void primeHints(void)
{
// prime root cache
templ[sizeof(templ)-1] = '\0';
*templ=c;
aaaarr.d_name=arr.d_name=DNSName(templ);
- t_rootNSZones.insert(arr.d_name.getLastLabel());
+ insertIntoRootNSZones(arr.d_name.getLastLabel());
nsrr.d_content=std::make_shared<NSRecordContent>(DNSName(templ));
arr.d_content=std::make_shared<ARecordContent>(ComboAddress(rootIps4[c-'a']));
vector<DNSRecord> aset;
rr.content=toLower(rr.content);
nsset.push_back(DNSRecord(rr));
}
- t_rootNSZones.insert(rr.qname.getLastLabel());
+ insertIntoRootNSZones(rr.qname.getLastLabel());
}
}
t_RC->doWipeCache(g_rootdnsname, false, QType::NS);
sr.setDNSSECValidationRequested(true);
}
for (const auto & qname: t_rootNSZones) {
- if (!qname.isRoot()) {
- t_RC->doWipeCache(qname, false, QType::NS);
- }
+ t_RC->doWipeCache(qname, false, QType::NS);
vector<DNSRecord> ret;
sr.beginResolve(qname, QType(QType::NS), QClass::IN, ret);
}