Skip to content

Commit 55b0653

Browse files
Peter van Dijkmind04
authored andcommitted
set AA on CNAME into referral, fixes #589
1 parent f0b3b24 commit 55b0653

File tree

2 files changed

+11
-10
lines changed

2 files changed

+11
-10
lines changed

pdns/packethandler.cc

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,7 @@ bool PacketHandler::getBestWildcard(DNSPacket *p, SOAData& sd, const string &tar
361361
}
362362

363363
/** dangling is declared true if we were unable to resolve everything */
364-
int PacketHandler::doAdditionalProcessingAndDropAA(DNSPacket *p, DNSPacket *r, const SOAData& soadata)
364+
int PacketHandler::doAdditionalProcessingAndDropAA(DNSPacket *p, DNSPacket *r, const SOAData& soadata, bool retargeted)
365365
{
366366
DNSResourceRecord rr;
367367
SOAData sd;
@@ -381,7 +381,7 @@ int PacketHandler::doAdditionalProcessingAndDropAA(DNSPacket *p, DNSPacket *r, c
381381

382382
// we now have a copy, push_back on packet might reallocate!
383383
for(vector<DNSResourceRecord>::const_iterator i=crrs.begin(); i!=crrs.end(); ++i) {
384-
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
384+
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
385385
r->setA(false);
386386
// i->d_place=DNSResourceRecord::AUTHORITY; // XXX FIXME
387387
}
@@ -895,7 +895,7 @@ bool PacketHandler::addDSforNS(DNSPacket* p, DNSPacket* r, SOAData& sd, const st
895895
return gotOne;
896896
}
897897

898-
bool PacketHandler::tryReferral(DNSPacket *p, DNSPacket*r, SOAData& sd, const string &target)
898+
bool PacketHandler::tryReferral(DNSPacket *p, DNSPacket*r, SOAData& sd, const string &target, bool retargeted)
899899
{
900900
vector<DNSResourceRecord> rrset = getBestReferralNS(p, sd, target);
901901
if(rrset.empty())
@@ -907,7 +907,8 @@ bool PacketHandler::tryReferral(DNSPacket *p, DNSPacket*r, SOAData& sd, const st
907907
rr.d_place=DNSResourceRecord::AUTHORITY;
908908
r->addRecord(rr);
909909
}
910-
r->setA(false);
910+
if(!retargeted)
911+
r->setA(false);
911912

912913
if(d_dk.isSecuredZone(sd.qname) && !addDSforNS(p, r, sd, rrset.begin()->qname))
913914
addNSECX(p, r, rrset.begin()->qname, "", sd.qname, 1);
@@ -1144,7 +1145,7 @@ DNSPacket *PacketHandler::questionOrRecurse(DNSPacket *p, bool *shouldRecurse)
11441145
}
11451146

11461147
DLOG(L<<"Checking for referrals first, unless this is a DS query"<<endl);
1147-
if(p->qtype.getCode() != QType::DS && tryReferral(p, r, sd, target))
1148+
if(p->qtype.getCode() != QType::DS && tryReferral(p, r, sd, target, retargetcount))
11481149
goto sendit;
11491150

11501151
DLOG(L<<"Got no referrals, trying ANY"<<endl);
@@ -1194,7 +1195,7 @@ DNSPacket *PacketHandler::questionOrRecurse(DNSPacket *p, bool *shouldRecurse)
11941195
if(p->qtype.getCode() == QType::DS)
11951196
{
11961197
DLOG(L<<"DS query found no direct result, trying referral now"<<endl);
1197-
if(tryReferral(p, r, sd, target))
1198+
if(tryReferral(p, r, sd, target, retargetcount))
11981199
{
11991200
DLOG(L<<"got referral for DS query"<<endl);
12001201
goto sendit;
@@ -1253,7 +1254,7 @@ DNSPacket *PacketHandler::questionOrRecurse(DNSPacket *p, bool *shouldRecurse)
12531254
}
12541255
else if(weHaveUnauth) {
12551256
DLOG(L<<"Have unauth data, so need to hunt for best NS records"<<endl);
1256-
if(tryReferral(p, r, sd, target))
1257+
if(tryReferral(p, r, sd, target, retargetcount))
12571258
goto sendit;
12581259
// check whether this could be fixed easily
12591260
if (*(rr.qname.rbegin()) == '.') {
@@ -1268,7 +1269,7 @@ DNSPacket *PacketHandler::questionOrRecurse(DNSPacket *p, bool *shouldRecurse)
12681269
}
12691270

12701271
sendit:;
1271-
if(doAdditionalProcessingAndDropAA(p, r, sd)<0) {
1272+
if(doAdditionalProcessingAndDropAA(p, r, sd, retargetcount)<0) {
12721273
delete r;
12731274
return 0;
12741275
}

pdns/packethandler.hh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ private:
9696
bool addNSEC3PARAM(DNSPacket *p, DNSPacket *r, const SOAData& sd);
9797
bool getAuth(DNSPacket *p, SOAData *sd, const string &target, int *zoneId);
9898
bool getTLDAuth(DNSPacket *p, SOAData *sd, const string &target, int *zoneId);
99-
int doAdditionalProcessingAndDropAA(DNSPacket *p, DNSPacket *r, const SOAData& sd);
99+
int doAdditionalProcessingAndDropAA(DNSPacket *p, DNSPacket *r, const SOAData& sd, bool retargeted);
100100
bool doDNSSECProcessing(DNSPacket* p, DNSPacket *r);
101101
void addNSECX(DNSPacket *p, DNSPacket* r, const string &target, const string &wildcard, const std::string &auth, int mode);
102102
void addNSEC(DNSPacket *p, DNSPacket* r, const string &target, const string &wildcard, const std::string& auth, int mode);
@@ -109,7 +109,7 @@ private:
109109
void makeNXDomain(DNSPacket* p, DNSPacket* r, const std::string& target, const std::string& wildcard, SOAData& sd);
110110
void makeNOError(DNSPacket* p, DNSPacket* r, const std::string& target, const std::string& wildcard, SOAData& sd, int mode);
111111
vector<DNSResourceRecord> getBestReferralNS(DNSPacket *p, SOAData& sd, const string &target);
112-
bool tryReferral(DNSPacket *p, DNSPacket*r, SOAData& sd, const string &target);
112+
bool tryReferral(DNSPacket *p, DNSPacket*r, SOAData& sd, const string &target, bool retargeted);
113113

114114
bool getBestWildcard(DNSPacket *p, SOAData& sd, const string &target, string &wildcard, vector<DNSResourceRecord>* ret);
115115
bool tryWildcard(DNSPacket *p, DNSPacket*r, SOAData& sd, string &target, string &wildcard, bool& retargeted, bool& nodata);

0 commit comments

Comments
 (0)