From: Otto Moerbeek Date: Wed, 26 Jun 2024 08:06:25 +0000 (+0200) Subject: Tidy AXFRRetriever::timeoutReadn X-Git-Tag: rec-5.2.0-alpha1~215^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=refs%2Fpull%2F14385%2Fhead;p=thirdparty%2Fpdns.git 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. --- 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); } }