Skip to content

Commit 5cfea4c

Browse files
committed
Add EDNS unknown version handling
1 parent 463fcff commit 5cfea4c

File tree

3 files changed

+25
-1
lines changed

3 files changed

+25
-1
lines changed

pdns/dnspacket.cc

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ DNSPacket::DNSPacket()
5656
d_wantsnsid=false;
5757
d_haveednssubnet = false;
5858
d_dnssecOk=false;
59+
d_ednsversion=0;
60+
d_ednsrcode=0;
5961
}
6062

6163
const string& DNSPacket::getString()
@@ -95,6 +97,8 @@ DNSPacket::DNSPacket(const DNSPacket &orig)
9597
d_eso = orig.d_eso;
9698
d_haveednssubnet = orig.d_haveednssubnet;
9799
d_haveednssection = orig.d_haveednssection;
100+
d_ednsversion = orig.d_ednsversion;
101+
d_ednsrcode = orig.d_ednsrcode;
98102
d_dnssecOk = orig.d_dnssecOk;
99103
d_rrs=orig.d_rrs;
100104

@@ -340,7 +344,7 @@ void DNSPacket::wrapup()
340344

341345
if(!opts.empty() || d_haveednssection || d_dnssecOk)
342346
{
343-
pw.addOpt(s_udpTruncationThreshold, 0, d_dnssecOk ? EDNSOpts::DNSSECOK : 0, opts);
347+
pw.addOpt(s_udpTruncationThreshold, d_ednsrcode, d_dnssecOk ? EDNSOpts::DNSSECOK : 0, opts);
344348
pw.commit();
345349
}
346350
}
@@ -396,6 +400,8 @@ DNSPacket *DNSPacket::replyPacket() const
396400
r->d_eso = d_eso;
397401
r->d_haveednssubnet = d_haveednssubnet;
398402
r->d_haveednssection = d_haveednssection;
403+
r->d_ednsversion = 0;
404+
r->d_ednsrcode = 0;
399405

400406
if(!d_tsigkeyname.empty()) {
401407
r->d_tsigkeyname = d_tsigkeyname;
@@ -549,6 +555,8 @@ try
549555
// cerr<<"Have an option #"<<iter->first<<": "<<makeHexDump(iter->second)<<endl;
550556
}
551557
}
558+
d_ednsversion = edo.d_version;
559+
d_ednsrcode = edo.d_extRCode;
552560
}
553561
else {
554562
d_maxreplylen=512;

pdns/dnspacket.hh

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,13 @@ public:
134134
bool couldBeCached(); //!< returns 0 if this query should bypass the packet cache
135135
bool hasEDNSSubnet();
136136
bool hasEDNS();
137+
uint8_t getEDNSVersion() const { return d_ednsversion; };
138+
void setEDNSRcode(uint16_t extRCode)
139+
{
140+
// WARNING: this is really 12 bits
141+
d_ednsrcode=extRCode;
142+
};
143+
uint8_t getEDNSRCode() const { return d_ednsrcode; };
137144
//////// DATA !
138145

139146
ComboAddress d_remote;
@@ -167,6 +174,8 @@ private:
167174
string d_rawpacket; // this is where everything lives 4
168175
int d_maxreplylen;
169176
string d_ednsping;
177+
uint8_t d_ednsversion;
178+
uint16_t d_ednsrcode; // WARNING: this is really 12 bits
170179
bool d_wantsnsid;
171180
bool d_haveednssubnet;
172181
bool d_haveednssection;

pdns/packethandler.cc

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -995,6 +995,13 @@ DNSPacket *PacketHandler::questionOrRecurse(DNSPacket *p, bool *shouldRecurse)
995995
return 0;
996996
}
997997

998+
if (p->hasEDNS() && p->getEDNSVersion() > 0) {
999+
r = p->replyPacket();
1000+
r->setRcode(16 & 0xF);
1001+
r->setEDNSRcode((16 & 0xFFF0)>>4); // set rcode to BADVERS
1002+
return r;
1003+
}
1004+
9981005
if(p->d_havetsig) {
9991006
string keyname, secret;
10001007
TSIGRecordContent trc;

0 commit comments

Comments
 (0)