From: Otto Moerbeek Date: Wed, 10 Jun 2020 07:54:20 +0000 (+0200) Subject: Check usefullness of root hints. X-Git-Tag: rec-4.4.0-beta1~56^2~9 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7d021373230108f9c6f70b4ac9ebfba4967b8e0d;p=thirdparty%2Fpdns.git Check usefullness of root hints. e.g. if we are running IPv6 only, and only have IPv4 hints things will not work. Base he decision on presence of A/AAAA records mentioned as NS. --- diff --git a/pdns/reczones.cc b/pdns/reczones.cc index 28716ac317..16d28b7101 100644 --- a/pdns/reczones.cc +++ b/pdns/reczones.cc @@ -84,24 +84,57 @@ void primeHints(void) ZoneParserTNG zpt(::arg()["hint-file"]); zpt.setMaxGenerateSteps(::arg().asNum("max-generate-steps")); DNSResourceRecord rr; + set seenNS; + set seenA; + set seenAAAA; while(zpt.get(rr)) { rr.ttl+=time(0); if(rr.qtype.getCode()==QType::A) { + seenA.insert(rr.qname); vector aset; aset.push_back(DNSRecord(rr)); s_RC->replace(time(0), rr.qname, QType(QType::A), aset, vector>(), vector>(), true, boost::none, boost::none, validationState); // auth, etc see above } else if(rr.qtype.getCode()==QType::AAAA) { + seenAAAA.insert(rr.qname); vector aaaaset; aaaaset.push_back(DNSRecord(rr)); s_RC->replace(time(0), rr.qname, QType(QType::AAAA), aaaaset, vector>(), vector>(), true, boost::none, boost::none, validationState); } else if(rr.qtype.getCode()==QType::NS) { + seenNS.insert(DNSName(rr.content)); rr.content=toLower(rr.content); nsset.push_back(DNSRecord(rr)); } insertIntoRootNSZones(rr.qname.getLastLabel()); } + + // Check reachability of A and AAAA records + bool reachableA = false, reachableAAAA = false; + for (auto const& r: seenA) { + if (seenNS.count(r)) { + reachableA = true; + } + } + for (auto const& r: seenAAAA) { + if (seenNS.count(r)) { + reachableAAAA = true; + } + } + if (SyncRes::s_doIPv4 && !SyncRes::s_doIPv6 && !reachableA) { + g_log<doWipeCache(g_rootdnsname, false, QType::NS); s_RC->replace(time(0), g_rootdnsname, QType(QType::NS), nsset, vector>(), vector>(), false, boost::none, boost::none, validationState); // and stuff in the cache }