forked from quic-go/quic-go
Merge pull request #1248 from lucas-clemente/fix-1247
allow empty STREAM frames at offset 0
This commit is contained in:
@@ -76,7 +76,8 @@ func parseStreamFrame(r *bytes.Reader, version protocol.VersionNumber) (*StreamF
|
|||||||
if frame.Offset+frame.DataLen() > protocol.MaxByteCount {
|
if frame.Offset+frame.DataLen() > protocol.MaxByteCount {
|
||||||
return nil, qerr.Error(qerr.InvalidStreamData, "data overflows maximum offset")
|
return nil, qerr.Error(qerr.InvalidStreamData, "data overflows maximum offset")
|
||||||
}
|
}
|
||||||
if !frame.FinBit && frame.DataLen() == 0 {
|
// empty frames are only allowed if they have offset 0 or the FIN bit set
|
||||||
|
if frame.DataLen() == 0 && !frame.FinBit && frame.Offset != 0 {
|
||||||
return nil, qerr.EmptyStreamFrameNoFin
|
return nil, qerr.EmptyStreamFrameNoFin
|
||||||
}
|
}
|
||||||
return frame, nil
|
return frame, nil
|
||||||
|
|||||||
@@ -56,10 +56,23 @@ var _ = Describe("STREAM frame (for IETF QUIC)", func() {
|
|||||||
Expect(r.Len()).To(BeZero())
|
Expect(r.Len()).To(BeZero())
|
||||||
})
|
})
|
||||||
|
|
||||||
It("rejects empty frames than don't have the FIN bit set", func() {
|
It("allows empty frames at offset 0", func() {
|
||||||
data := []byte{0x10}
|
data := []byte{0x10}
|
||||||
data = append(data, encodeVarInt(0x1337)...) // stream ID
|
data = append(data, encodeVarInt(0x1337)...) // stream ID
|
||||||
r := bytes.NewReader(data)
|
r := bytes.NewReader(data)
|
||||||
|
f, err := parseStreamFrame(r, versionIETFFrames)
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
Expect(f.StreamID).To(Equal(protocol.StreamID(0x1337)))
|
||||||
|
Expect(f.Data).To(BeEmpty())
|
||||||
|
Expect(f.Offset).To(BeZero())
|
||||||
|
Expect(f.FinBit).To(BeFalse())
|
||||||
|
})
|
||||||
|
|
||||||
|
It("rejects empty frames than don't have the FIN bit set", func() {
|
||||||
|
data := []byte{0x10 ^ 0x4}
|
||||||
|
data = append(data, encodeVarInt(0x1337)...) // stream ID
|
||||||
|
data = append(data, encodeVarInt(0xdecafbad)...) // offset
|
||||||
|
r := bytes.NewReader(data)
|
||||||
_, err := parseStreamFrame(r, versionIETFFrames)
|
_, err := parseStreamFrame(r, versionIETFFrames)
|
||||||
Expect(err).To(MatchError(qerr.EmptyStreamFrameNoFin))
|
Expect(err).To(MatchError(qerr.EmptyStreamFrameNoFin))
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user