gfe-relnote: Switch from closing the connection to QUIC_BUG in two ShouldCreateIncomingStream() overrides when called with locally initiated stream ID. Protected by gfe2_reloadable_flag_quic_create_incoming_stream_bug. ShouldCreateIncomingStream() is only called from CreateIncomingStream(), which is only be called from QuicSession::GetOrCreateStream(), which already handles this case by calling HandleFrameOnNonexistentOutgoingStream(). PiperOrigin-RevId: 301278886 Change-Id: I46711aaeb69fe184c328bb57b9a86ee618815616
diff --git a/quic/core/http/quic_server_session_base.cc b/quic/core/http/quic_server_session_base.cc index 3a7dd98..759c5a5 100644 --- a/quic/core/http/quic_server_session_base.cc +++ b/quic/core/http/quic_server_session_base.cc
@@ -201,6 +201,17 @@ return false; } + if (GetQuicReloadableFlag(quic_create_incoming_stream_bug)) { + if (QuicUtils::IsServerInitiatedStreamId(transport_version(), id)) { + QUIC_RELOADABLE_FLAG_COUNT_N(quic_create_incoming_stream_bug, 1, 2); + QUIC_BUG << "ShouldCreateIncomingStream called with server initiated " + "stream ID."; + return false; + } else { + QUIC_RELOADABLE_FLAG_COUNT_N(quic_create_incoming_stream_bug, 2, 2); + } + } + if (QuicUtils::IsServerInitiatedStreamId(transport_version(), id)) { QUIC_DLOG(INFO) << "Invalid incoming even stream_id:" << id; connection()->CloseConnection(
diff --git a/quic/core/http/quic_spdy_client_session.cc b/quic/core/http/quic_spdy_client_session.cc index b7130c3..07b9c7a 100644 --- a/quic/core/http/quic_spdy_client_session.cc +++ b/quic/core/http/quic_spdy_client_session.cc
@@ -136,6 +136,17 @@ return false; } + if (GetQuicReloadableFlag(quic_create_incoming_stream_bug)) { + if (QuicUtils::IsClientInitiatedStreamId(transport_version(), id)) { + QUIC_RELOADABLE_FLAG_COUNT_N(quic_create_incoming_stream_bug, 1, 2); + QUIC_BUG << "ShouldCreateIncomingStream called with client initiated " + "stream ID."; + return false; + } else { + QUIC_RELOADABLE_FLAG_COUNT_N(quic_create_incoming_stream_bug, 2, 2); + } + } + if (QuicUtils::IsClientInitiatedStreamId(transport_version(), id)) { QUIC_LOG(WARNING) << "Received invalid push stream id " << id; connection()->CloseConnection(
diff --git a/quic/tools/quic_simple_server_session_test.cc b/quic/tools/quic_simple_server_session_test.cc index a19adec..363dfd9 100644 --- a/quic/tools/quic_simple_server_session_test.cc +++ b/quic/tools/quic_simple_server_session_test.cc
@@ -443,17 +443,6 @@ EXPECT_EQ(initial_num_open_stream, session_->GetNumOpenIncomingStreams()); } -TEST_P(QuicSimpleServerSessionTest, CreateEvenIncomingDynamicStream) { - // Tests that incoming stream creation fails when given stream id is even. - size_t initial_num_open_stream = session_->GetNumOpenIncomingStreams(); - EXPECT_CALL(*connection_, - CloseConnection(QUIC_INVALID_STREAM_ID, - "Client created even numbered stream", _)); - QuicSimpleServerSessionPeer::CreateIncomingStream( - session_.get(), GetNthServerInitiatedUnidirectionalId(0)); - EXPECT_EQ(initial_num_open_stream, session_->GetNumOpenIncomingStreams()); -} - TEST_P(QuicSimpleServerSessionTest, CreateIncomingStream) { QuicSpdyStream* stream = QuicSimpleServerSessionPeer::CreateIncomingStream( session_.get(), GetNthClientInitiatedBidirectionalId(0)); @@ -561,9 +550,10 @@ session_->OnStreamFrame(frame); } +// Tests that calling GetOrCreateStream() on an outgoing stream not promised yet +// should result close connection. TEST_P(QuicSimpleServerSessionTest, GetEvenIncomingError) { - // Tests that calling GetOrCreateStream() on an outgoing stream not - // promised yet should result close connection. + const size_t initial_num_open_stream = session_->GetNumOpenIncomingStreams(); const QuicErrorCode expected_error = VersionUsesHttp3(transport_version()) ? QUIC_HTTP_STREAM_WRONG_DIRECTION : QUIC_INVALID_STREAM_ID; @@ -572,6 +562,7 @@ EXPECT_EQ(nullptr, QuicSessionPeer::GetOrCreateStream( session_.get(), GetNthServerInitiatedUnidirectionalId(3))); + EXPECT_EQ(initial_num_open_stream, session_->GetNumOpenIncomingStreams()); } // In order to test the case where server push stream creation goes beyond