gfe-relnote: Do not pad server initial connection close packet. Protected by blocked gfe2_reloadable_flag_quic_enable_version_t*.
PiperOrigin-RevId: 294975306
Change-Id: Iee6759502df58292cc69f634c6273bd3b5b542b7
diff --git a/quic/core/quic_connection_test.cc b/quic/core/quic_connection_test.cc
index 67e2ab0..a7eac86 100644
--- a/quic/core/quic_connection_test.cc
+++ b/quic/core/quic_connection_test.cc
@@ -8173,6 +8173,26 @@
ASSERT_TRUE(writer_->coalesced_packet() == nullptr);
}
+TEST_P(QuicConnectionTest, DoNotPadServerInitialConnectionClose) {
+ if (!connection_.SupportsMultiplePacketNumberSpaces()) {
+ return;
+ }
+ set_perspective(Perspective::IS_SERVER);
+
+ EXPECT_CALL(visitor_, OnConnectionClosed(_, _));
+ const QuicErrorCode kQuicErrorCode = QUIC_INTERNAL_ERROR;
+ connection_.CloseConnection(
+ kQuicErrorCode, "Some random error message",
+ ConnectionCloseBehavior::SEND_CONNECTION_CLOSE_PACKET);
+
+ EXPECT_EQ(2u, QuicConnectionPeer::GetNumEncryptionLevels(&connection_));
+
+ TestConnectionCloseQuicErrorCode(kQuicErrorCode);
+ EXPECT_EQ(1u, writer_->connection_close_frames().size());
+ EXPECT_TRUE(writer_->padding_frames().empty());
+ EXPECT_EQ(ENCRYPTION_INITIAL, writer_->framer()->last_decrypted_level());
+}
+
// Regression test for b/63620844.
TEST_P(QuicConnectionTest, FailedToWriteHandshakePacket) {
SimulateNextPacketTooLarge();
diff --git a/quic/core/quic_packet_creator.cc b/quic/core/quic_packet_creator.cc
index 30df1a3..aa749c6 100644
--- a/quic/core/quic_packet_creator.cc
+++ b/quic/core/quic_packet_creator.cc
@@ -941,10 +941,17 @@
<< "Attempt to serialize empty coalesced packet";
size_t packet_length = 0;
if (coalesced.initial_packet() != nullptr) {
+ // Padding coalesced packet containing initial packet to full.
+ size_t padding_size = coalesced.max_packet_length() - coalesced.length();
+ if (framer_->perspective() == Perspective::IS_SERVER &&
+ QuicUtils::ContainsFrameType(
+ coalesced.initial_packet()->retransmittable_frames,
+ CONNECTION_CLOSE_FRAME)) {
+ // Do not pad server initial connection close packet.
+ padding_size = 0;
+ }
size_t initial_length = ReserializeInitialPacketInCoalescedPacket(
- *coalesced.initial_packet(),
- /*padding_size=*/coalesced.max_packet_length() - coalesced.length(),
- buffer, buffer_len);
+ *coalesced.initial_packet(), padding_size, buffer, buffer_len);
if (initial_length == 0) {
QUIC_BUG << "Failed to reserialize ENCRYPTION_INITIAL packet in "
"coalesced packet";