In QuicConnection::ScopedPacketFlusher::~ScopedPacketFlusher, early return if connection is disconnected after FlushPackets. This is to fix https://bugs.chromium.org/p/chromium/issues/detail?id=1334021. Protected by FLAGS_quic_reloadable_flag_quic_packet_flusher_check_connected_after_flush_packets. PiperOrigin-RevId: 455696161
diff --git a/quiche/quic/core/quic_connection.cc b/quiche/quic/core/quic_connection.cc index 3c9034f..ad7a103 100644 --- a/quiche/quic/core/quic_connection.cc +++ b/quiche/quic/core/quic_connection.cc
@@ -4844,6 +4844,14 @@ connection_->FlushCoalescedPacket(); } connection_->FlushPackets(); + if (GetQuicReloadableFlag( + quic_packet_flusher_check_connected_after_flush_packets)) { + QUIC_RELOADABLE_FLAG_COUNT( + quic_packet_flusher_check_connected_after_flush_packets); + if (!connection_->connected()) { + return; + } + } if (!handshake_packet_sent_ && connection_->handshake_packet_sent_) { // This would cause INITIAL key to be dropped. Drop keys here to avoid // missing the write keys in the middle of writing.
diff --git a/quiche/quic/core/quic_connection_test.cc b/quiche/quic/core/quic_connection_test.cc index 2a89850..35c30f4 100644 --- a/quiche/quic/core/quic_connection_test.cc +++ b/quiche/quic/core/quic_connection_test.cc
@@ -9871,7 +9871,10 @@ use_tagging_decrypter(); auto test_body = [&] { - EXPECT_CALL(visitor_, OnHandshakePacketSent()); + if (!GetQuicReloadableFlag( + quic_packet_flusher_check_connected_after_flush_packets)) { + EXPECT_CALL(visitor_, OnHandshakePacketSent()); + } EXPECT_CALL(visitor_, OnConnectionClosed(_, ConnectionCloseSource::FROM_SELF))
diff --git a/quiche/quic/core/quic_flags_list.h b/quiche/quic/core/quic_flags_list.h index 938446d..745bebd 100644 --- a/quiche/quic/core/quic_flags_list.h +++ b/quiche/quic/core/quic_flags_list.h
@@ -23,6 +23,8 @@ QUIC_FLAG(quic_restart_flag_quic_disable_legacy_version_encapsulation, false) // If true, QUIC will default enable MTU discovery at server, with a target of 1450 bytes. QUIC_FLAG(quic_reloadable_flag_quic_enable_mtu_discovery_at_server, false) +// If true, QuicConnection::ScopedPacketFlusher::~ScopedPacketFlusher will early return if connection is disconnected after FlushPackets. +QUIC_FLAG(quic_reloadable_flag_quic_packet_flusher_check_connected_after_flush_packets, true) // 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, TlsHandshaker::AdvanceHandshake will check if connection is closed after SSL_do_handshake.