Add more protection in QuicSpdySession::GetSpdyDataStream().
From the definition of GetOrCreateDynamicStream(), it's possible that the returned stream is a static non-spdy stream.
So instead of using DCHECK as invariants, I think it'd be better if we close connection here.
gfe-relnote: Protected by gfe2_reloadable_flag_quic_handle_staticness_when_getting_spdy_stream
PiperOrigin-RevId: 257486450
Change-Id: I7ac6c4b6f9e78ff263ee0937c647bbfb35de4e22
diff --git a/quic/core/http/quic_spdy_session.cc b/quic/core/http/quic_spdy_session.cc
index 9e4178f..e264f3d 100644
--- a/quic/core/http/quic_spdy_session.cc
+++ b/quic/core/http/quic_spdy_session.cc
@@ -560,6 +560,15 @@
QuicSpdyStream* QuicSpdySession::GetSpdyDataStream(
const QuicStreamId stream_id) {
QuicStream* stream = GetOrCreateDynamicStream(stream_id);
+ if (GetQuicReloadableFlag(quic_handle_staticness_for_spdy_stream) && stream &&
+ stream->is_static()) {
+ QUIC_RELOADABLE_FLAG_COUNT(quic_handle_staticness_for_spdy_stream);
+ QUIC_BUG << "GetSpdyDataStream returns static stream";
+ connection()->CloseConnection(
+ QUIC_INVALID_STREAM_ID, "stream is static",
+ ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET);
+ return nullptr;
+ }
DCHECK(!stream || !stream->is_static());
return static_cast<QuicSpdyStream*>(stream);
}