From 2e5c7586b75669ff15f244b020b0e01dc300d7dd Mon Sep 17 00:00:00 2001 From: Otto Moerbeek Date: Wed, 26 Jun 2024 10:06:25 +0200 Subject: [PATCH] Tidy AXFRRetriever::timeoutReadn 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 | 34 +++++++++++++++++++++------------- 1 file changed, 21 insertions(+), 13 deletions(-) diff --git a/pdns/axfr-retriever.cc b/pdns/axfr-retriever.cc index f2630c9aeb..9b2a4bf92e 100644 --- a/pdns/axfr-retriever.cc +++ b/pdns/axfr-retriever.cc @@ -171,23 +171,31 @@ int AXFRRetriever::getChunk(Resolver::res_t &res, vector* records, ui void AXFRRetriever::timeoutReadn(uint16_t bytes, uint16_t timeoutsec) { - time_t start=time(nullptr); - int n=0; - int numread; - while(n(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(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(received); } } -- 2.47.2