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