Merge pull request #1176 from lucas-clemente/fix-1711

don't send an ACK frame for Retry packets
This commit is contained in:
Marten Seemann
2018-02-21 09:42:29 +08:00
committed by GitHub
2 changed files with 18 additions and 3 deletions

View File

@@ -536,9 +536,13 @@ func (s *session) handlePacketImpl(p *receivedPacket) error {
// Only do this after decrypting, so we are sure the packet is not attacker-controlled
s.largestRcvdPacketNumber = utils.MaxPacketNumber(s.largestRcvdPacketNumber, hdr.PacketNumber)
isRetransmittable := ackhandler.HasRetransmittableFrames(packet.frames)
if err = s.receivedPacketHandler.ReceivedPacket(hdr.PacketNumber, p.rcvTime, isRetransmittable); err != nil {
return err
// If this is a Retry packet, there's no need to send an ACK.
// The session will be closed and recreated as soon as the crypto setup processed the HRR.
if hdr.Type != protocol.PacketTypeRetry {
isRetransmittable := ackhandler.HasRetransmittableFrames(packet.frames)
if err := s.receivedPacketHandler.ReceivedPacket(hdr.PacketNumber, p.rcvTime, isRetransmittable); err != nil {
return err
}
}
return s.handleFrames(packet.frames, packet.encryptionLevel)

View File

@@ -569,6 +569,17 @@ var _ = Describe("Session", func() {
Expect(err).ToNot(HaveOccurred())
})
It("doesn't inform the ReceivedPacketHandler about Retry packets", func() {
now := time.Now().Add(time.Hour)
rph := mockackhandler.NewMockReceivedPacketHandler(mockCtrl)
sess.receivedPacketHandler = rph
// don't EXPECT any call to ReceivedPacket
hdr.PacketNumber = 5
hdr.Type = protocol.PacketTypeRetry
err := sess.handlePacketImpl(&receivedPacket{header: hdr, rcvTime: now})
Expect(err).ToNot(HaveOccurred())
})
It("closes when handling a packet fails", func(done Done) {
streamManager.EXPECT().CloseWithError(gomock.Any())
testErr := errors.New("unpack error")