gfe-relnote: In QUIC, check connected_ when processing MaxStreamsFrame and StreamsBlockedFrame. Protected by disabled v99 flag. PiperOrigin-RevId: 292991614 Change-Id: Ibe06fe72f3fc8e289979204dd7b790b280d93c5e
diff --git a/quic/core/quic_connection.cc b/quic/core/quic_connection.cc index 9202cf5..246d9d9 100644 --- a/quic/core/quic_connection.cc +++ b/quic/core/quic_connection.cc
@@ -1268,7 +1268,7 @@ if (debug_visitor_ != nullptr) { debug_visitor_->OnMaxStreamsFrame(frame); } - return visitor_->OnMaxStreamsFrame(frame); + return visitor_->OnMaxStreamsFrame(frame) && connected_; } bool QuicConnection::OnStreamsBlockedFrame( @@ -1276,7 +1276,7 @@ if (debug_visitor_ != nullptr) { debug_visitor_->OnStreamsBlockedFrame(frame); } - return visitor_->OnStreamsBlockedFrame(frame); + return visitor_->OnStreamsBlockedFrame(frame) && connected_; } bool QuicConnection::OnGoAwayFrame(const QuicGoAwayFrame& frame) {
diff --git a/quic/core/quic_connection_test.cc b/quic/core/quic_connection_test.cc index 91d7a9d..40f1895 100644 --- a/quic/core/quic_connection_test.cc +++ b/quic/core/quic_connection_test.cc
@@ -9881,6 +9881,46 @@ } } +// Regression test for http://crbug/1047977 +TEST_P(QuicConnectionTest, MaxStreamsFrameCausesConnectionClose) { + if (!VersionHasIetfQuicFrames(connection_.transport_version())) { + return; + } + // Received frame causes connection close. + EXPECT_CALL(visitor_, OnMaxStreamsFrame(_)) + .WillOnce(InvokeWithoutArgs([this]() { + EXPECT_CALL(visitor_, OnConnectionClosed(_, _)); + connection_.CloseConnection( + QUIC_TOO_MANY_BUFFERED_CONTROL_FRAMES, "error", + ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET); + return true; + })); + QuicFrames frames; + frames.push_back(QuicFrame(QuicMaxStreamsFrame())); + frames.push_back(QuicFrame(QuicPaddingFrame(-1))); + ProcessFramesPacketAtLevel(1, frames, ENCRYPTION_FORWARD_SECURE); +} + +TEST_P(QuicConnectionTest, StreamsBlockedFrameCausesConnectionClose) { + if (!VersionHasIetfQuicFrames(connection_.transport_version())) { + return; + } + // Received frame causes connection close. + EXPECT_CALL(visitor_, OnStreamsBlockedFrame(_)) + .WillOnce(InvokeWithoutArgs([this]() { + EXPECT_CALL(visitor_, OnConnectionClosed(_, _)); + connection_.CloseConnection( + QUIC_TOO_MANY_BUFFERED_CONTROL_FRAMES, "error", + ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET); + return true; + })); + QuicFrames frames; + frames.push_back( + QuicFrame(QuicStreamsBlockedFrame(kInvalidControlFrameId, 10, false))); + frames.push_back(QuicFrame(QuicPaddingFrame(-1))); + ProcessFramesPacketAtLevel(1, frames, ENCRYPTION_FORWARD_SECURE); +} + } // namespace } // namespace test } // namespace quic