diff -ru dnsdist-1.9.12.orig/dnsdist-nghttp2.cc dnsdist-1.9.12.CVE-2026-33596/dnsdist-nghttp2.cc --- dnsdist-1.9.12.orig/dnsdist-nghttp2.cc 2026-03-13 16:09:16.000000000 +0100 +++ dnsdist-1.9.12.CVE-2026-33596/dnsdist-nghttp2.cc 2026-04-03 15:43:43.035961460 +0200 @@ -218,7 +218,7 @@ bool DoHConnectionToBackend::reachedMaxStreamID() const { const uint32_t maximumStreamID = (static_cast(1) << 31) - 1; - return d_highestStreamID == maximumStreamID; + return d_highestStreamID >= maximumStreamID; } bool DoHConnectionToBackend::reachedMaxConcurrentQueries() const diff -ru dnsdist-1.9.12.orig/dnsdist-tcp-downstream.cc dnsdist-1.9.12.CVE-2026-33596/dnsdist-tcp-downstream.cc --- dnsdist-1.9.12.orig/dnsdist-tcp-downstream.cc 2026-03-13 16:09:16.000000000 +0100 +++ dnsdist-1.9.12.CVE-2026-33596/dnsdist-tcp-downstream.cc 2026-04-03 15:43:43.036061820 +0200 @@ -858,6 +858,18 @@ return done; } +bool TCPConnectionToBackend::reachedMaxStreamID() const +{ + /* TCP/DoT has only 2^16 usable identifiers, DoH has 2^32 */ + const uint32_t maximumStreamID = std::numeric_limits::max() - 1; + if (d_highestStreamID >= maximumStreamID) { + return true; + } + + /* pending queries will need IDs, so we need to take them into account as well */ + return (d_pendingQueries.size() >= (maximumStreamID - d_highestStreamID)); +} + void setTCPDownstreamMaxIdleConnectionsPerBackend(uint64_t max) { DownstreamTCPConnectionsManager::setMaxIdleConnectionsPerDownstream(max); diff -ru dnsdist-1.9.12.orig/dnsdist-tcp-downstream.hh dnsdist-1.9.12.CVE-2026-33596/dnsdist-tcp-downstream.hh --- dnsdist-1.9.12.orig/dnsdist-tcp-downstream.hh 2026-03-13 16:09:16.000000000 +0100 +++ dnsdist-1.9.12.CVE-2026-33596/dnsdist-tcp-downstream.hh 2026-04-03 15:43:43.036131683 +0200 @@ -237,12 +237,7 @@ return d_state == State::idle && d_pendingQueries.size() == 0 && d_pendingResponses.size() == 0; } - bool reachedMaxStreamID() const override - { - /* TCP/DoT has only 2^16 usable identifiers, DoH has 2^32 */ - const uint32_t maximumStreamID = std::numeric_limits::max() - 1; - return d_highestStreamID == maximumStreamID; - } + bool reachedMaxStreamID() const override; bool reachedMaxConcurrentQueries() const override {