]> git.ipfire.org Git - thirdparty/pdns.git/commitdiff
dnsdist: Clean QUIC stream-related data after errors 17214/head
authorRemi Gacogne <remi.gacogne@powerdns.com>
Thu, 2 Apr 2026 13:04:46 +0000 (15:04 +0200)
committerRemi Gacogne <remi.gacogne@powerdns.com>
Thu, 2 Apr 2026 13:07:01 +0000 (15:07 +0200)
Signed-off-by: Remi Gacogne <remi.gacogne@powerdns.com>
pdns/dnsdistdist/doh3.cc
pdns/dnsdistdist/doq.cc

index 5f46661a47c465973af4d8eb8f9ce434a7dce0f1..933624a4f1f8892600caa3bf43c4cd03480157ca 100644 (file)
@@ -748,6 +748,8 @@ static void processH3HeaderEvent(ClientState& clientState, DOH3Frontend& fronten
     ++clientState.nonCompliantQueries;
     ++frontend.d_errorResponses;
     h3_send_response(conn, streamID, 400, msg);
+    conn.d_streamBuffers.erase(streamID);
+    conn.d_headersBuffers.erase(streamID);
   };
 
   auto& headers = conn.d_headersBuffers.at(streamID);
@@ -892,8 +894,11 @@ static void processH3Events(ClientState& clientState, DOH3Frontend& frontend, H3
     }
     case QUICHE_H3_EVENT_FINISHED:
     case QUICHE_H3_EVENT_RESET:
-    case QUICHE_H3_EVENT_PRIORITY_UPDATE:
+      conn.d_headersBuffers.erase(streamID);
+      conn.d_streamBuffers.erase(streamID);
+      break;
     case QUICHE_H3_EVENT_GOAWAY:
+    case QUICHE_H3_EVENT_PRIORITY_UPDATE:
       break;
     }
 
index 43cce00ab7949bf17e898db09a1c38c528e07ac7..71a67d62b64577ec4a208a85b804ea5fb439ff61 100644 (file)
@@ -647,6 +647,7 @@ static void handleReadableStream(DOQFrontend& frontend, ClientState& clientState
       ++dnsdist::metrics::g_stats.nonCompliantQueries;
       ++clientState.nonCompliantQueries;
       quiche_conn_stream_shutdown(conn.d_conn.get(), streamID, QUICHE_SHUTDOWN_WRITE, static_cast<uint64_t>(DOQ_Error_Codes::DOQ_PROTOCOL_ERROR));
+      conn.d_streamBuffers.erase(streamID);
       return;
     }
 
@@ -660,6 +661,7 @@ static void handleReadableStream(DOQFrontend& frontend, ClientState& clientState
     ++dnsdist::metrics::g_stats.nonCompliantQueries;
     ++clientState.nonCompliantQueries;
     quiche_conn_stream_shutdown(conn.d_conn.get(), streamID, QUICHE_SHUTDOWN_WRITE, static_cast<uint64_t>(DOQ_Error_Codes::DOQ_PROTOCOL_ERROR));
+    conn.d_streamBuffers.erase(streamID);
     return;
   }
 
@@ -669,6 +671,7 @@ static void handleReadableStream(DOQFrontend& frontend, ClientState& clientState
     ++dnsdist::metrics::g_stats.nonCompliantQueries;
     ++clientState.nonCompliantQueries;
     quiche_conn_stream_shutdown(conn.d_conn.get(), streamID, QUICHE_SHUTDOWN_WRITE, static_cast<uint64_t>(DOQ_Error_Codes::DOQ_PROTOCOL_ERROR));
+    conn.d_streamBuffers.erase(streamID);
     return;
   }
   DEBUGLOG("Dispatching query");