File rec-3.7.3-spuriousrrs-167732.patch of Package pdns-recursor.7531
--- a/dnsparser.cc
+++ a/dnsparser.cc
@@ -142,7 +142,7 @@ shared_ptr<DNSRecordContent> DNSRecordContent::unserialize(const string& qname,
memcpy(&packet[pos], &drh, sizeof(drh)); pos+=sizeof(drh);
memcpy(&packet[pos], serialized.c_str(), serialized.size()); pos+=(uint16_t)serialized.size();
- MOADNSParser mdp((char*)&*packet.begin(), (unsigned int)packet.size());
+ MOADNSParser mdp(false, (char*)&*packet.begin(), (unsigned int)packet.size());
shared_ptr<DNSRecordContent> ret= mdp.d_answers.begin()->first.d_content;
ret->header.d_type=ret->d_qtype;
ret->label=mdp.d_answers.begin()->first.d_label;
@@ -217,7 +217,7 @@ DNSRecordContent::zmakermap_t& DNSRecordContent::getZmakermap()
return zmakermap;
}
-void MOADNSParser::init(const char *packet, unsigned int len)
+void MOADNSParser::init(bool query, const char *packet, unsigned int len)
{
if(len < sizeof(dnsheader))
throw MOADNSException("Packet shorter than minimal header");
@@ -232,6 +232,9 @@ void MOADNSParser::init(const char *packet, unsigned int len)
d_header.nscount=ntohs(d_header.nscount);
d_header.arcount=ntohs(d_header.arcount);
+ if (query && (d_header.qdcount > 1))
+ throw MOADNSException("Query with QD > 1 ("+lexical_cast<string>(d_header.qdcount)+")");
+
uint16_t contentlen=len-sizeof(dnsheader);
d_content.resize(contentlen);
@@ -275,7 +278,13 @@ void MOADNSParser::init(const char *packet, unsigned int len)
dr.d_label=label;
dr.d_clen=ah.d_clen;
- dr.d_content=boost::shared_ptr<DNSRecordContent>(DNSRecordContent::mastermake(dr, pr, d_header.opcode));
+ if (query && (dr.d_place == DNSRecord::Answer || dr.d_place == DNSRecord::Nameserver || (dr.d_type != QType::OPT && dr.d_type != QType::TSIG && dr.d_type != QType::SIG) || ((dr.d_type == QType::TSIG || dr.d_type == QType::SIG) && dr.d_class != QClass::ANY))) {
+ dr.d_content=boost::shared_ptr<DNSRecordContent>(new UnknownRecordContent(dr, pr));
+ }
+ else {
+ dr.d_content=boost::shared_ptr<DNSRecordContent>(DNSRecordContent::mastermake(dr, pr, d_header.opcode));
+ }
+
d_answers.push_back(make_pair(dr, pr.d_pos));
if(dr.d_type == QType::TSIG && dr.d_class == 0xff)
--- a/dnsparser.hh
+++ a/dnsparser.hh
@@ -306,15 +306,15 @@ class MOADNSParser : public boost::noncopyable
{
public:
//! Parse from a string
- MOADNSParser(const string& buffer) : d_tsigPos(0)
+ MOADNSParser(bool query, const string& buffer) : d_tsigPos(0)
{
- init(buffer.c_str(), (unsigned int)buffer.size());
+ init(query, buffer.c_str(), (unsigned int)buffer.size());
}
//! Parse from a pointer and length
- MOADNSParser(const char *packet, unsigned int len) : d_tsigPos(0)
+ MOADNSParser(bool query, const char *packet, unsigned int len) : d_tsigPos(0)
{
- init(packet, len);
+ init(query, packet, len);
}
dnsheader d_header;
@@ -340,7 +340,7 @@ public:
}
private:
void getDnsrecordheader(struct dnsrecordheader &ah);
- void init(const char *packet, unsigned int len);
+ void init(bool query, const char *packet, unsigned int len);
vector<uint8_t> d_content;
uint16_t d_tsigPos;
};
--- a/lwres.cc
+++ a/lwres.cc
@@ -157,7 +157,7 @@ int asyncresolve(const ComboAddress& ip, const string& domain, int type, bool do
lwr->d_result.clear();
try {
lwr->d_tcbit=0;
- MOADNSParser mdp((const char*)buf.get(), len);
+ MOADNSParser mdp(false, (const char*)buf.get(), len);
lwr->d_aabit=mdp.d_header.aa;
lwr->d_tcbit=mdp.d_header.tc;
lwr->d_rcode=mdp.d_header.rcode;
--- a/pdns_recursor.cc
+++ a/pdns_recursor.cc
@@ -140,7 +140,7 @@ unsigned int g_numThreads, g_numWorkerThreads;
//! used to send information to a newborn mthread
struct DNSComboWriter {
- DNSComboWriter(const char* data, uint16_t len, const struct timeval& now) : d_mdp(data, len), d_now(now),
+ DNSComboWriter(const char* data, uint16_t len, const struct timeval& now) : d_mdp(true, data, len), d_now(now),
d_tcp(false), d_socket(-1)
{}
MOADNSParser d_mdp;