]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
Enforce proxy protocol size limit earlier. 17459/head
authorMiod Vallat <miod.vallat@powerdns.com>
Thu, 21 May 2026 14:33:39 +0000 (16:33 +0200)
committerMiod Vallat <miod.vallat@powerdns.com>
Thu, 21 May 2026 15:47:04 +0000 (17:47 +0200)
Signed-off-by: Miod Vallat <miod.vallat@powerdns.com>
pdns/tcpreceiver.cc

index 4b8604d2d6a7f04d978852c1463bc01633649ce0..d42bf4d227ce3335da3fc2f6f01653e421e554a8 100644 (file)
@@ -275,14 +275,18 @@ void TCPNameserver::doConnection(int fd, Logr::log_t slog)
       for (;;) {
         used = isProxyHeaderComplete(proxyData);
         if (used < 0) {
-          ssize_t origsize = proxyData.size();
-          proxyData.resize(origsize + -used);
+          size_t origsize = proxyData.size();
+          auto extra = static_cast<size_t>(-used);
+          if (origsize + extra > g_proxyProtocolMaximumSize) {
+            throw NetworkError("Error reading PROXYv2 header from TCP client "+remote.toString()+": PROXYv2 header too big");
+          }
+          proxyData.resize(origsize + extra);
           if (maxConnectionDurationReached(d_maxConnectionDuration, start, remainingTime)) {
             throw NetworkError("Error reading PROXYv2 header from TCP client "+remote.toString()+": maximum TCP connection duration exceeded");
           }
 
           try {
-            readnWithTimeout(fd, &proxyData[origsize], -used, d_idleTimeout, true, remainingTime);
+            readnWithTimeout(fd, &proxyData[origsize], extra, d_idleTimeout, true, remainingTime);
           }
           catch(NetworkError& ae) {
             throw NetworkError("Error reading PROXYv2 header from TCP client "+remote.toString()+": "+ae.what());