gfe-relnote: Fix an unsigned integer overflow bug in QUIC v99 when processing Ack frame. Not used in prod. Not protected. PiperOrigin-RevId: 283749707 Change-Id: I0da7578f275146448a29c497c52074e97a257240
diff --git a/quic/core/quic_framer.cc b/quic/core/quic_framer.cc index fdb2074..c5708b9 100644 --- a/quic/core/quic_framer.cc +++ b/quic/core/quic_framer.cc
@@ -3656,7 +3656,7 @@ return false; } - if (ack_delay_time_in_us == kVarInt62MaxValue) { + if (ack_delay_time_in_us >= (kVarInt62MaxValue >> peer_ack_delay_exponent_)) { ack_frame->ack_delay_time = QuicTime::Delta::Infinite(); } else { ack_delay_time_in_us = (ack_delay_time_in_us << peer_ack_delay_exponent_);
diff --git a/quic/core/quic_framer_test.cc b/quic/core/quic_framer_test.cc index 9dc6fde..ff9653d 100644 --- a/quic/core/quic_framer_test.cc +++ b/quic/core/quic_framer_test.cc
@@ -13867,6 +13867,42 @@ EXPECT_EQ("", frame.error_details); } +// Regression test for crbug/1029636. +TEST_P(QuicFramerTest, OverlyLargeAckDelay) { + if (!VersionHasIetfQuicFrames(framer_.transport_version())) { + return; + } + SetDecrypterLevel(ENCRYPTION_FORWARD_SECURE); + // clang-format off + unsigned char packet99[] = { + // type (short header, 4 byte packet number) + 0x43, + // connection_id + 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10, + // packet number + 0x12, 0x34, 0x56, 0x78, + + // frame type (IETF_ACK frame) + 0x02, + // largest acked + kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x78, + // ack delay time. + kVarInt62EightBytes + 0x31, 0x00, 0x00, 0x00, 0xF3, 0xA0, 0x81, 0xE0, + // Nr. of additional ack blocks + kVarInt62OneByte + 0x00, + // first ack block length. + kVarInt62FourBytes + 0x12, 0x34, 0x56, 0x77, + }; + // clang-format on + + framer_.ProcessPacket( + QuicEncryptedPacket(AsChars(packet99), QUIC_ARRAYSIZE(packet99), false)); + ASSERT_EQ(1u, visitor_.ack_frames_.size()); + // Verify ack_delay_time is set correctly. + EXPECT_EQ(QuicTime::Delta::Infinite(), + visitor_.ack_frames_[0]->ack_delay_time); +} + } // namespace } // namespace test } // namespace quic