panic if the value for WriteUint48, WriteUint40, WriteUint24 is too big

Note that it's not possible to write a couple of frame types for packet
numbers that don't fit into 6 bytes. The IETF QUIC draft fixes this.
This commit is contained in:
Marten Seemann
2017-08-02 15:11:13 +07:00
parent 2330ac0497
commit 05fde42e2d
6 changed files with 54 additions and 21 deletions

View File

@@ -219,7 +219,7 @@ func (f *AckFrame) Write(b *bytes.Buffer, version protocol.VersionNumber) error
case protocol.PacketNumberLen4:
utils.LittleEndian.WriteUint32(b, uint32(f.LargestAcked))
case protocol.PacketNumberLen6:
utils.LittleEndian.WriteUint48(b, uint64(f.LargestAcked))
utils.LittleEndian.WriteUint48(b, uint64(f.LargestAcked)&(1<<48-1))
}
f.DelayTime = time.Since(f.PacketReceivedTime)
@@ -257,7 +257,7 @@ func (f *AckFrame) Write(b *bytes.Buffer, version protocol.VersionNumber) error
case protocol.PacketNumberLen4:
utils.LittleEndian.WriteUint32(b, uint32(firstAckBlockLength))
case protocol.PacketNumberLen6:
utils.LittleEndian.WriteUint48(b, uint64(firstAckBlockLength))
utils.LittleEndian.WriteUint48(b, uint64(firstAckBlockLength)&(1<<48-1))
}
for i, ackRange := range f.AckRanges {
@@ -283,7 +283,7 @@ func (f *AckFrame) Write(b *bytes.Buffer, version protocol.VersionNumber) error
case protocol.PacketNumberLen4:
utils.LittleEndian.WriteUint32(b, uint32(length))
case protocol.PacketNumberLen6:
utils.LittleEndian.WriteUint48(b, uint64(length))
utils.LittleEndian.WriteUint48(b, uint64(length)&(1<<48-1))
}
numRangesWritten++
} else {
@@ -308,7 +308,7 @@ func (f *AckFrame) Write(b *bytes.Buffer, version protocol.VersionNumber) error
case protocol.PacketNumberLen4:
utils.LittleEndian.WriteUint32(b, uint32(lengthWritten))
case protocol.PacketNumberLen6:
utils.LittleEndian.WriteUint48(b, lengthWritten)
utils.LittleEndian.WriteUint48(b, lengthWritten&(1<<48-1))
}
numRangesWritten++

View File

@@ -46,7 +46,7 @@ func (f *StopWaitingFrame) Write(b *bytes.Buffer, version protocol.VersionNumber
case protocol.PacketNumberLen4:
utils.LittleEndian.WriteUint32(b, uint32(leastUnackedDelta))
case protocol.PacketNumberLen6:
utils.LittleEndian.WriteUint48(b, leastUnackedDelta)
utils.LittleEndian.WriteUint48(b, leastUnackedDelta&(1<<48-1))
default:
return errPacketNumberLenNotSet
}

View File

@@ -95,7 +95,8 @@ var _ = Describe("StopWaitingFrame", func() {
PacketNumber: 13,
PacketNumberLen: protocol.PacketNumberLen1,
}
frame.Write(b, 0)
err := frame.Write(b, 0)
Expect(err).ToNot(HaveOccurred())
Expect(b.Len()).To(Equal(2))
Expect(b.Bytes()[1]).To(Equal(uint8(3)))
})
@@ -107,7 +108,8 @@ var _ = Describe("StopWaitingFrame", func() {
PacketNumber: 0x1300,
PacketNumberLen: protocol.PacketNumberLen2,
}
frame.Write(b, 0)
err := frame.Write(b, 0)
Expect(err).ToNot(HaveOccurred())
Expect(b.Len()).To(Equal(3))
Expect(b.Bytes()[1:3]).To(Equal([]byte{0xF0, 0x12}))
})
@@ -119,19 +121,21 @@ var _ = Describe("StopWaitingFrame", func() {
PacketNumber: 0x12345678,
PacketNumberLen: protocol.PacketNumberLen4,
}
frame.Write(b, 0)
err := frame.Write(b, 0)
Expect(err).ToNot(HaveOccurred())
Expect(b.Len()).To(Equal(5))
Expect(b.Bytes()[1:5]).To(Equal([]byte{0x78, 0x46, 0x34, 0x12}))
})
It("writes a 6-byte LeastUnackedDelta", func() {
It("writes a 6-byte LeastUnackedDelta, for a delta that fits into 6 bytes", func() {
b := &bytes.Buffer{}
frame := &StopWaitingFrame{
LeastUnacked: 0x10,
PacketNumber: 0x123456789ABC,
PacketNumberLen: protocol.PacketNumberLen6,
}
frame.Write(b, 0)
err := frame.Write(b, 0)
Expect(err).ToNot(HaveOccurred())
Expect(b.Len()).To(Equal(7))
Expect(b.Bytes()[1:7]).To(Equal([]byte{0xAC, 0x9A, 0x78, 0x56, 0x34, 0x12}))
})