]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Properly handle truncation for UDP responses sent via `sendmmsg` 16064/head
authorRemi Gacogne <remi.gacogne@powerdns.com>
Mon, 1 Sep 2025 12:00:09 +0000 (14:00 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Mon, 1 Sep 2025 15:36:08 +0000 (17:36 +0200)
Signed-off-by: Remi Gacogne <remi.gacogne@powerdns.com>
pdns/dnsdistdist/dnsdist.cc

index 2e00169e3f6df81111fe11d47e04b63644d281f2..d8e3b0260bcb0651f3cc3346e5ce6ed8736b796b 100644 (file)
@@ -1909,6 +1909,8 @@ static void processUDPQuery(ClientState& clientState, const struct msghdr* msgh,
     // the buffer might have been invalidated by now (resized)
     const auto dnsHeader = dnsQuestion.getHeader();
     if (result == ProcessQueryResult::SendAnswer) {
+      /* ensure payload size is not exceeded */
+      handleResponseTC4UDPClient(dnsQuestion, udpPayloadSize, query);
 #ifndef DISABLE_RECVMMSG
 #if defined(HAVE_RECVMMSG) && defined(HAVE_SENDMMSG) && defined(MSG_WAITFORONE)
       if (dnsQuestion.ids.delayMsec == 0 && responsesVect != nullptr) {
@@ -1919,8 +1921,6 @@ static void processUDPQuery(ClientState& clientState, const struct msghdr* msgh,
       }
 #endif /* defined(HAVE_RECVMMSG) && defined(HAVE_SENDMMSG) && defined(MSG_WAITFORONE) */
 #endif /* DISABLE_RECVMMSG */
-      /* ensure payload size is not exceeded */
-      handleResponseTC4UDPClient(dnsQuestion, udpPayloadSize, query);
       /* we use dest, always, because we don't want to use the listening address to send a response since it could be 0.0.0.0 */
       sendUDPResponse(clientState.udpFD, query, dnsQuestion.ids.delayMsec, dest, remote);