From c8e7cd66e3ab9a4dfbd8a5a43df2f89db131c1db Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Thu, 28 Aug 2025 22:12:20 +0800 Subject: [PATCH] ackhandler: immediately clear ackedPacket slice after processing ACK (#5313) * ackhandler: immediately clear ackedPacket slice after processing ACK * ackhandler: add defensive check for empty ackedPackets slice --- internal/ackhandler/sent_packet_handler.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/internal/ackhandler/sent_packet_handler.go b/internal/ackhandler/sent_packet_handler.go index 90f1dec71..c01ca91c7 100644 --- a/internal/ackhandler/sent_packet_handler.go +++ b/internal/ackhandler/sent_packet_handler.go @@ -406,7 +406,9 @@ func (h *sentPacketHandler) ReceivedAck(ack *wire.AckFrame, encLevel protocol.En } // After this point, we must not use ackedPackets any longer! // We've already returned the buffers. - ackedPackets = nil //nolint:ineffassign // This is just to be on the safe side. + ackedPackets = nil //nolint:ineffassign // This is just to be on the safe side. + clear(h.ackedPackets) // make sure the memory is released + h.ackedPackets = h.ackedPackets[:0] // Reset the pto_count unless the client is unsure if the server has validated the client's address. if h.peerCompletedAddressValidation { @@ -432,8 +434,10 @@ func (h *sentPacketHandler) GetLowestPacketNotConfirmedAcked() protocol.PacketNu // Packets are returned in ascending packet number order. func (h *sentPacketHandler) detectAndRemoveAckedPackets(ack *wire.AckFrame, encLevel protocol.EncryptionLevel) ([]*packet, error) { pnSpace := h.getPacketNumberSpace(encLevel) - h.ackedPackets = h.ackedPackets[:0] ackRangeIndex := 0 + if len(h.ackedPackets) > 0 { + return nil, errors.New("ackhandler BUG: ackedPackets slice not empty") + } lowestAcked := ack.LowestAcked() largestAcked := ack.LargestAcked() for p := range pnSpace.history.Packets() {