]> granicus.if.org Git - pdns/commitdiff
AXFRRetriever: Don't parse records of answers with a non-zero code
authorRemi Gacogne <remi.gacogne@powerdns.com>
Mon, 27 Aug 2018 15:45:45 +0000 (17:45 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Tue, 28 Aug 2018 09:01:17 +0000 (11:01 +0200)
Also reuse records from MOADNSParser whenever possible, instead of
allocating new ones.

pdns/resolver.cc

index 25f38446cfc26c6baae4aa9e2c58684ff3ae9a89..d01baa690e28656904e7f845e5d41771a3019b03 100644 (file)
@@ -205,6 +205,8 @@ static int parseResult(MOADNSParser& mdp, const DNSName& origQname, uint16_t ori
 
   vector<DNSResourceRecord> 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<DNSRecord>* 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<DNSRecord>* 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;
 }