]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Tidy AXFRRetriever::timeoutReadn 14385/head
authorOtto Moerbeek <otto.moerbeek@open-xchange.com>
Wed, 26 Jun 2024 08:06:25 +0000 (10:06 +0200)
committerOtto Moerbeek <otto.moerbeek@open-xchange.com>
Wed, 26 Jun 2024 08:06:25 +0000 (10:06 +0200)
Including a fix to timeout potentially underflowing.
Coverity complains about n (now called bytesRead) overflowing, but that's a false positive, as numread is bounded.

pdns/axfr-retriever.cc

index f2630c9aebf47139e20e92ef42c533c21c84229b..9b2a4bf92e1a5e679af3731d6c36fe9cd101a2cf 100644 (file)
@@ -171,23 +171,31 @@ int AXFRRetriever::getChunk(Resolver::res_t &res, vector<DNSRecord>* records, ui
 
 void AXFRRetriever::timeoutReadn(uint16_t bytes, uint16_t timeoutsec)
 {
-  time_t start=time(nullptr);
-  int n=0;
-  int numread;
-  while(n<bytes) {
+  const time_t start = time(nullptr);
+  uint16_t bytesRead = 0;
+
+  while (bytesRead < bytes) {
     // coverity[store_truncates_time_t]
-    int res=waitForData(d_sock, static_cast<int>(timeoutsec - (time(nullptr) - start)));
-    if(res<0)
-      throw ResolverException("Reading data from remote nameserver over TCP: "+stringerror());
-    if(!res)
+    auto elapsed = time(nullptr) - start;
+    if (elapsed > timeoutsec) {
       throw ResolverException("Timeout while reading data from remote nameserver over TCP");
+    }
+    auto res = waitForData(d_sock, static_cast<int>(timeoutsec - elapsed));
+    if (res < 0) {
+      throw ResolverException("Reading data from remote nameserver over TCP: " + stringerror());
+    }
+    if (res == 0) {
+      throw ResolverException("Timeout while reading data from remote nameserver over TCP");
+    }
 
-    numread=recv(d_sock, &d_buf.at(n), bytes-n, 0);
-    if(numread<0)
-      throw ResolverException("Reading data from remote nameserver over TCP: "+stringerror());
-    if(numread==0)
+    auto received = recv(d_sock, &d_buf.at(bytesRead), bytes - bytesRead, 0);
+    if (received < 0) {
+      throw ResolverException("Reading data from remote nameserver over TCP: " + stringerror());
+    }
+    if (received == 0) {
       throw ResolverException("Remote nameserver closed TCP connection");
-    n+=numread;
+    }
+    bytesRead += static_cast<uint16_t>(received);
   }
 }