Fix LegacyQuicStreamIdManager when CRYPTO frames are used gfe-relnote: LegacyQuicStreamIdManager refactor protected by QUIC_VERSION_99 PiperOrigin-RevId: 255327682 Change-Id: I561dbf10e61d8733188e67ad4f3becfd449d38f6
diff --git a/quic/core/legacy_quic_stream_id_manager.cc b/quic/core/legacy_quic_stream_id_manager.cc index 447f16d..a7ec123 100644 --- a/quic/core/legacy_quic_stream_id_manager.cc +++ b/quic/core/legacy_quic_stream_id_manager.cc
@@ -26,9 +26,8 @@ session->perspective() == Perspective::IS_SERVER ? (QuicVersionUsesCryptoFrames( session->connection()->transport_version()) - ? QuicUtils::GetFirstBidirectionalStreamId( - session->connection()->transport_version(), - Perspective::IS_CLIENT) + ? QuicUtils::GetInvalidStreamId( + session->connection()->transport_version()) : QuicUtils::GetCryptoStreamId( session->connection()->transport_version())) : QuicUtils::GetInvalidStreamId( @@ -83,6 +82,11 @@ // only alternately-numbered streams. size_t additional_available_streams = (stream_id - largest_peer_created_stream_id_) / 2 - 1; + if (largest_peer_created_stream_id_ == + QuicUtils::GetInvalidStreamId( + session_->connection()->transport_version())) { + additional_available_streams = (stream_id + 1) / 2 - 1; + } size_t new_num_available_streams = GetNumAvailableStreams() + additional_available_streams; if (new_num_available_streams > MaxAvailableStreams()) { @@ -99,8 +103,15 @@ ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET); return false; } - for (QuicStreamId id = largest_peer_created_stream_id_ + 2; id < stream_id; - id += 2) { + QuicStreamId first_available_stream = largest_peer_created_stream_id_ + 2; + if (largest_peer_created_stream_id_ == + QuicUtils::GetInvalidStreamId( + session_->connection()->transport_version())) { + first_available_stream = QuicUtils::GetFirstBidirectionalStreamId( + session_->connection()->transport_version(), + QuicUtils::InvertPerspective(session_->perspective())); + } + for (QuicStreamId id = first_available_stream; id < stream_id; id += 2) { available_streams_.insert(id); } largest_peer_created_stream_id_ = stream_id;