]> granicus.if.org Git - pdns/commitdiff
dnsparser: don't make UnknownRecordContent on IXFR
authorPieter Lexis <pieter.lexis@powerdns.com>
Fri, 19 Jan 2018 09:42:24 +0000 (10:42 +0100)
committerPieter Lexis <pieter.lexis@powerdns.com>
Mon, 29 Jan 2018 08:20:14 +0000 (09:20 +0100)
IXFRs contain the SOA of the client client's zone-version in the
AUTHORITY section. Parse it properly so the ixfrdistributor can use it.

pdns/dnsparser.cc

index ba44b61e8da961174abffb112f784c5d5a159650..dfee6c399680e12d396e9a9a6e2cf50fc9c36b5f 100644 (file)
@@ -285,7 +285,9 @@ void MOADNSParser::init(bool query, const char *packet, unsigned int len)
       dr.d_name=name;
       dr.d_clen=ah.d_clen;
 
-      if (query && (dr.d_place == DNSResourceRecord::ANSWER || dr.d_place == DNSResourceRecord::AUTHORITY || (dr.d_type != QType::OPT && dr.d_type != QType::TSIG && dr.d_type != QType::SIG && dr.d_type != QType::TKEY) || ((dr.d_type == QType::TSIG || dr.d_type == QType::SIG || dr.d_type == QType::TKEY) && dr.d_class != QClass::ANY))) {
+      if (query &&
+          !(d_qtype == QType::IXFR && dr.d_place == DNSResourceRecord::AUTHORITY && dr.d_type == QType::SOA) && // IXFR queries have a SOA in their AUTHORITY section
+          (dr.d_place == DNSResourceRecord::ANSWER || dr.d_place == DNSResourceRecord::AUTHORITY || (dr.d_type != QType::OPT && dr.d_type != QType::TSIG && dr.d_type != QType::SIG && dr.d_type != QType::TKEY) || ((dr.d_type == QType::TSIG || dr.d_type == QType::SIG || dr.d_type == QType::TKEY) && dr.d_class != QClass::ANY))) {
 //        cerr<<"discarding RR, query is "<<query<<", place is "<<dr.d_place<<", type is "<<dr.d_type<<", class is "<<dr.d_class<<endl;
         dr.d_content=std::make_shared<UnknownRecordContent>(dr, pr);
       }