From: Remi Gacogne Date: Mon, 27 Aug 2018 15:45:45 +0000 (+0200) Subject: AXFRRetriever: Don't parse records of answers with a non-zero code X-Git-Tag: dnsdist-1.3.3~143^2~4 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dc470c5a43276596c41d0285e982d0d37e14ad47;p=thirdparty%2Fpdns.git AXFRRetriever: Don't parse records of answers with a non-zero code Also reuse records from MOADNSParser whenever possible, instead of allocating new ones. --- diff --git a/pdns/resolver.cc b/pdns/resolver.cc index 25f38446cf..d01baa690e 100644 --- a/pdns/resolver.cc +++ b/pdns/resolver.cc @@ -205,6 +205,8 @@ static int parseResult(MOADNSParser& mdp, const DNSName& origQname, uint16_t ori vector ret; DNSResourceRecord rr; + result->reserve(mdp.d_answers.size()); + for (const auto& i: mdp.d_answers) { rr.qname = i.first.d_name; rr.qtype = i.first.d_type; @@ -455,23 +457,12 @@ int AXFRRetriever::getChunk(Resolver::res_t &res, vector* records, ui MOADNSParser mdp(false, d_buf.get(), len); - int err; - if(!records) - err=parseResult(mdp, DNSName(), 0, 0, &res); - else { - records->clear(); - for(const auto& r: mdp.d_answers) - records->push_back(r.first); - err = mdp.d_header.rcode; - } - - if(err) + int err = mdp.d_header.rcode; + + if(err) { throw ResolverException("AXFR chunk error: " + RCode::to_s(err)); + } - for(const MOADNSParser::answers_t::value_type& answer : mdp.d_answers) - if (answer.first.d_type == QType::SOA) - d_soacount++; - try { d_tsigVerifier.check(std::string(d_buf.get(), len), mdp); } @@ -479,6 +470,28 @@ int AXFRRetriever::getChunk(Resolver::res_t &res, vector* records, ui throw ResolverException(re.what()); } + if(!records) { + err = parseResult(mdp, DNSName(), 0, 0, &res); + + if (!err) { + for(const auto& answer : mdp.d_answers) + if (answer.first.d_type == QType::SOA) + d_soacount++; + } + } + else { + records->clear(); + records->reserve(mdp.d_answers.size()); + + for(auto& r: mdp.d_answers) { + if (r.first.d_type == QType::SOA) { + d_soacount++; + } + + records->push_back(std::move(r.first)); + } + } + return true; }