From: Remi Gacogne Date: Mon, 14 Aug 2023 08:56:21 +0000 (+0200) Subject: dnsdist: Properly handle short reads on backend upgrade discovery X-Git-Tag: dnsdist-1.8.1~6^2~5 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9c8d25156592daeaf3daeb9c1a1669fcd9e3fbd0;p=thirdparty%2Fpdns.git dnsdist: Properly handle short reads on backend upgrade discovery (cherry picked from commit 1769de1da569cacf5b4c1c1b68198e42cea3e7de) --- diff --git a/pdns/dnsdistdist/dnsdist-discovery.cc b/pdns/dnsdistdist/dnsdist-discovery.cc index 9d267ecded..61ff2f2976 100644 --- a/pdns/dnsdistdist/dnsdist-discovery.cc +++ b/pdns/dnsdistdist/dnsdist-discovery.cc @@ -272,8 +272,9 @@ bool ServiceDiscovery::getDiscoveredConfig(const UpgradeableBackend& upgradeable sock.writenWithTimeout(reinterpret_cast(packet.data()), packet.size(), backend->d_config.tcpSendTimeout); + const struct timeval remainingTime = { .tv_sec = backend->d_config.tcpRecvTimeout, .tv_usec = 0 }; uint16_t responseSize = 0; - auto got = sock.readWithTimeout(reinterpret_cast(&responseSize), sizeof(responseSize), backend->d_config.tcpRecvTimeout); + auto got = readn2WithTimeout(sock.getHandle(), &responseSize, sizeof(responseSize), remainingTime); if (got < 0 || static_cast(got) != sizeof(responseSize)) { if (g_verbose) { warnlog("Error while waiting for the ADD upgrade response size from backend %s: %d", addr.toStringWithPort(), got); @@ -283,7 +284,7 @@ bool ServiceDiscovery::getDiscoveredConfig(const UpgradeableBackend& upgradeable packet.resize(ntohs(responseSize)); - got = sock.readWithTimeout(reinterpret_cast(packet.data()), packet.size(), backend->d_config.tcpRecvTimeout); + got = readn2WithTimeout(sock.getHandle(), packet.data(), packet.size(), remainingTime); if (got < 0 || static_cast(got) != packet.size()) { if (g_verbose) { warnlog("Error while waiting for the ADD upgrade response from backend %s: %d", addr.toStringWithPort(), got);