Do not send RETIRE_CONNECTION_ID frame when the connection is closed. There's recently another bug found at https://bugs.chromium.org/p/chromium/issues/detail?id=1514016 where multiple RETIRE_CONNECTION_ID frames are sent. If one of the send triggers connection close, the following send will encounter the QUIC_BUG. Protected by quic_reloadable_flag_quic_no_write_control_frame_upon_connection_close2. PiperOrigin-RevId: 599216282
diff --git a/quiche/quic/core/quic_flags_list.h b/quiche/quic/core/quic_flags_list.h index bc0890b..bbf4aeb 100644 --- a/quiche/quic/core/quic_flags_list.h +++ b/quiche/quic/core/quic_flags_list.h
@@ -41,6 +41,8 @@ QUIC_FLAG(quic_reloadable_flag_quic_enable_mtu_discovery_at_server, false) // If true, QuicGsoBatchWriter will support release time if it is available and the process has the permission to do so. QUIC_FLAG(quic_restart_flag_quic_support_release_time_for_gso, false) +// If true, QuicSession will block outgoing control frames when the connection is closed. +QUIC_FLAG(quic_reloadable_flag_quic_no_write_control_frame_upon_connection_close2, false) // If true, ack frequency frame can be sent from server to client. QUIC_FLAG(quic_reloadable_flag_quic_can_send_ack_frequency, true) // If true, allow client to enable BBRv2 on server via connection option \'B2ON\'.
diff --git a/quiche/quic/core/quic_session.cc b/quiche/quic/core/quic_session.cc index 665e4ff..6e655c5 100644 --- a/quiche/quic/core/quic_session.cc +++ b/quiche/quic/core/quic_session.cc
@@ -2232,6 +2232,14 @@ } void QuicSession::SendRetireConnectionId(uint64_t sequence_number) { + if (GetQuicReloadableFlag( + quic_no_write_control_frame_upon_connection_close2)) { + QUIC_RELOADABLE_FLAG_COUNT( + quic_no_write_control_frame_upon_connection_close2); + if (!connection_->connected()) { + return; + } + } control_frame_manager_.WriteOrBufferRetireConnectionId(sequence_number); }
diff --git a/quiche/quic/core/quic_session_test.cc b/quiche/quic/core/quic_session_test.cc index 8950bc1..897cc80 100644 --- a/quiche/quic/core/quic_session_test.cc +++ b/quiche/quic/core/quic_session_test.cc
@@ -2220,6 +2220,24 @@ &session_, GetNthClientInitiatedBidirectionalId(1))); } +// Regression test for +// https://bugs.chromium.org/p/chromium/issues/detail?id=1514016 +TEST_P(QuicSessionTestClient, DonotSendRetireCIDFrameWhenConnectionClosed) { + if (!VersionHasIetfQuicFrames(transport_version())) { + return; + } + connection_->ReallyCloseConnection(QUIC_NO_ERROR, "closing", + ConnectionCloseBehavior::SILENT_CLOSE); + EXPECT_FALSE(connection_->connected()); + if (!GetQuicReloadableFlag( + quic_no_write_control_frame_upon_connection_close2)) { + EXPECT_QUIC_BUG(session_.SendRetireConnectionId(20), + "Try to write control frame"); + } else { + session_.SendRetireConnectionId(20); + } +} + TEST_P(QuicSessionTestClient, NewStreamCreationResumesMultiPortProbing) { if (!VersionHasIetfQuicFrames(transport_version())) { return;