]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
resolver.{cc,hh}: Allow setting the inbound AXFR timeout
authorPieter Lexis <pieter.lexis@powerdns.com>
Wed, 14 Feb 2018 12:58:15 +0000 (13:58 +0100)
committerPieter Lexis <pieter.lexis@powerdns.com>
Thu, 22 Feb 2018 10:41:55 +0000 (11:41 +0100)
(cherry picked from commit 99bea744a47e6de2ec399e78c0e43cd1b54537b3)

pdns/resolver.cc
pdns/resolver.hh

index 51d81160c49af4e11556fa30784d8833b97ee9cc..b40d5b7da09362c9df672f0d29f0368a1a713a52 100644 (file)
@@ -446,7 +446,7 @@ AXFRRetriever::~AXFRRetriever()
 
 
 
-int AXFRRetriever::getChunk(Resolver::res_t &res, vector<DNSRecord>* records) // Implementation is making sure RFC2845 4.4 is followed.
+int AXFRRetriever::getChunk(Resolver::res_t &res, vector<DNSRecord>* records, uint16_t timeout) // Implementation is making sure RFC2845 4.4 is followed.
 {
   if(d_soacount > 1)
     return false;
@@ -459,7 +459,7 @@ int AXFRRetriever::getChunk(Resolver::res_t &res, vector<DNSRecord>* records) //
   if (d_maxReceivedBytes > 0 && (d_maxReceivedBytes - d_receivedBytes) < (size_t) len)
     throw ResolverException("Reached the maximum number of received bytes during AXFR");
 
-  timeoutReadn(len);
+  timeoutReadn(len, timeout);
 
   d_receivedBytes += (uint16_t) len;
 
@@ -492,13 +492,13 @@ int AXFRRetriever::getChunk(Resolver::res_t &res, vector<DNSRecord>* records) //
   return true;
 }
 
-void AXFRRetriever::timeoutReadn(uint16_t bytes)
+void AXFRRetriever::timeoutReadn(uint16_t bytes, uint16_t timeoutsec)
 {
-  time_t start=time(0);
+  time_t start=time(nullptr);
   int n=0;
   int numread;
   while(n<bytes) {
-    int res=waitForData(d_sock, 10-(time(0)-start));
+    int res=waitForData(d_sock, timeoutsec-(time(nullptr)-start));
     if(res<0)
       throw ResolverException("Reading data from remote nameserver over TCP: "+stringerror());
     if(!res)
index e6c6e7ae5622d8869bba1b86d1320656481a7e00..6dd55ec2535a29fe91e51e8c9c74860ee0f0e61a 100644 (file)
@@ -90,12 +90,12 @@ class AXFRRetriever : public boost::noncopyable
                   const ComboAddress* laddr = NULL,
                   size_t maxReceivedBytes=0);
     ~AXFRRetriever();
-    int getChunk(Resolver::res_t &res, vector<DNSRecord>* records=0);  
+    int getChunk(Resolver::res_t &res, vector<DNSRecord>* records=0, uint16_t timeout=10);
   
   private:
     void connect();
     int getLength();
-    void timeoutReadn(uint16_t bytes);  
+    void timeoutReadn(uint16_t bytes, uint16_t timeoutsec=10);
 
     shared_array<char> d_buf;
     string d_domain;