forked from quic-go/quic-go
use largest received packet number in packet number inflation
fixes #309
This commit is contained in:
@@ -76,9 +76,10 @@ type Session struct {
|
||||
|
||||
connectionParametersManager *handshake.ConnectionParametersManager
|
||||
|
||||
lastRcvdPacketNumber protocol.PacketNumber
|
||||
// Used to calculate the next packet number from the truncated wire
|
||||
// representation, and sent back in public reset packets
|
||||
lastRcvdPacketNumber protocol.PacketNumber
|
||||
largestRcvdPacketNumber protocol.PacketNumber
|
||||
|
||||
lastNetworkActivityTime time.Time
|
||||
|
||||
@@ -239,7 +240,7 @@ func (s *Session) handlePacketImpl(remoteAddr interface{}, hdr *PublicHeader, da
|
||||
// Calculate packet number
|
||||
hdr.PacketNumber = protocol.InferPacketNumber(
|
||||
hdr.PacketNumberLen,
|
||||
s.lastRcvdPacketNumber,
|
||||
s.largestRcvdPacketNumber,
|
||||
hdr.PacketNumber,
|
||||
)
|
||||
if utils.Debug() {
|
||||
@@ -254,8 +255,9 @@ func (s *Session) handlePacketImpl(remoteAddr interface{}, hdr *PublicHeader, da
|
||||
return err
|
||||
}
|
||||
|
||||
// Only do this after decrypting, so we are sure the packet is not attacker-controlled
|
||||
s.lastRcvdPacketNumber = hdr.PacketNumber
|
||||
// Only do this after decrypting, so we are sure the packet is not attacker-controlled
|
||||
s.largestRcvdPacketNumber = utils.MaxPacketNumber(s.largestRcvdPacketNumber, hdr.PacketNumber)
|
||||
|
||||
err = s.receivedPacketHandler.ReceivedPacket(hdr.PacketNumber, packet.entropyBit)
|
||||
// ignore duplicate packets
|
||||
|
||||
@@ -464,22 +464,25 @@ var _ = Describe("Session", func() {
|
||||
hdr = &PublicHeader{PacketNumberLen: protocol.PacketNumberLen6}
|
||||
})
|
||||
|
||||
It("sets the lastRcvdPacketNumber", func() {
|
||||
It("sets the {last,largest}RcvdPacketNumber", func() {
|
||||
hdr.PacketNumber = 5
|
||||
err := session.handlePacketImpl(nil, hdr, nil)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(session.lastRcvdPacketNumber).To(Equal(protocol.PacketNumber(5)))
|
||||
Expect(session.largestRcvdPacketNumber).To(Equal(protocol.PacketNumber(5)))
|
||||
})
|
||||
|
||||
It("sets the lastRcvdPacketNumber, for an out-of-order packet", func() {
|
||||
It("sets the {last,largest}RcvdPacketNumber, for an out-of-order packet", func() {
|
||||
hdr.PacketNumber = 5
|
||||
err := session.handlePacketImpl(nil, hdr, nil)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(session.lastRcvdPacketNumber).To(Equal(protocol.PacketNumber(5)))
|
||||
Expect(session.largestRcvdPacketNumber).To(Equal(protocol.PacketNumber(5)))
|
||||
hdr.PacketNumber = 3
|
||||
err = session.handlePacketImpl(nil, hdr, nil)
|
||||
Expect(err).ToNot(HaveOccurred())
|
||||
Expect(session.lastRcvdPacketNumber).To(Equal(protocol.PacketNumber(3)))
|
||||
Expect(session.largestRcvdPacketNumber).To(Equal(protocol.PacketNumber(5)))
|
||||
})
|
||||
|
||||
It("ignores duplicate packets", func() {
|
||||
|
||||
Reference in New Issue
Block a user