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); }