From 55b0653a56e18a3eb96f0d54eabdcb86b9396512 Mon Sep 17 00:00:00 2001 From: Peter van Dijk Date: Tue, 30 Sep 2014 15:33:44 +0000 Subject: [PATCH] set AA on CNAME into referral, fixes #589 --- pdns/packethandler.cc | 17 +++++++++-------- pdns/packethandler.hh | 4 ++-- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/pdns/packethandler.cc b/pdns/packethandler.cc index 3b2dbe08b..03c4c9536 100644 --- a/pdns/packethandler.cc +++ b/pdns/packethandler.cc @@ -361,7 +361,7 @@ bool PacketHandler::getBestWildcard(DNSPacket *p, SOAData& sd, const string &tar } /** dangling is declared true if we were unable to resolve everything */ -int PacketHandler::doAdditionalProcessingAndDropAA(DNSPacket *p, DNSPacket *r, const SOAData& soadata) +int PacketHandler::doAdditionalProcessingAndDropAA(DNSPacket *p, DNSPacket *r, const SOAData& soadata, bool retargeted) { DNSResourceRecord rr; SOAData sd; @@ -381,7 +381,7 @@ int PacketHandler::doAdditionalProcessingAndDropAA(DNSPacket *p, DNSPacket *r, c // we now have a copy, push_back on packet might reallocate! for(vector::const_iterator i=crrs.begin(); i!=crrs.end(); ++i) { - if(r->d.aa && !i->qname.empty() && i->qtype.getCode()==QType::NS && !B.getSOA(i->qname,sd,p)) { // drop AA in case of non-SOA-level NS answer, except for root referral + if(r->d.aa && !i->qname.empty() && i->qtype.getCode()==QType::NS && !B.getSOA(i->qname,sd,p) && !retargeted) { // drop AA in case of non-SOA-level NS answer, except for root referral r->setA(false); // i->d_place=DNSResourceRecord::AUTHORITY; // XXX FIXME } @@ -895,7 +895,7 @@ bool PacketHandler::addDSforNS(DNSPacket* p, DNSPacket* r, SOAData& sd, const st return gotOne; } -bool PacketHandler::tryReferral(DNSPacket *p, DNSPacket*r, SOAData& sd, const string &target) +bool PacketHandler::tryReferral(DNSPacket *p, DNSPacket*r, SOAData& sd, const string &target, bool retargeted) { vector rrset = getBestReferralNS(p, sd, target); if(rrset.empty()) @@ -907,7 +907,8 @@ bool PacketHandler::tryReferral(DNSPacket *p, DNSPacket*r, SOAData& sd, const st rr.d_place=DNSResourceRecord::AUTHORITY; r->addRecord(rr); } - r->setA(false); + if(!retargeted) + r->setA(false); if(d_dk.isSecuredZone(sd.qname) && !addDSforNS(p, r, sd, rrset.begin()->qname)) addNSECX(p, r, rrset.begin()->qname, "", sd.qname, 1); @@ -1144,7 +1145,7 @@ DNSPacket *PacketHandler::questionOrRecurse(DNSPacket *p, bool *shouldRecurse) } DLOG(L<<"Checking for referrals first, unless this is a DS query"<qtype.getCode() != QType::DS && tryReferral(p, r, sd, target)) + if(p->qtype.getCode() != QType::DS && tryReferral(p, r, sd, target, retargetcount)) goto sendit; DLOG(L<<"Got no referrals, trying ANY"<qtype.getCode() == QType::DS) { DLOG(L<<"DS query found no direct result, trying referral now"< getBestReferralNS(DNSPacket *p, SOAData& sd, const string &target); - bool tryReferral(DNSPacket *p, DNSPacket*r, SOAData& sd, const string &target); + bool tryReferral(DNSPacket *p, DNSPacket*r, SOAData& sd, const string &target, bool retargeted); bool getBestWildcard(DNSPacket *p, SOAData& sd, const string &target, string &wildcard, vector* ret); bool tryWildcard(DNSPacket *p, DNSPacket*r, SOAData& sd, string &target, string &wildcard, bool& retargeted, bool& nodata); -- 2.40.0