From 30c948a2fdbe426e0c6bf6639f6646fd70e38c7f Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Wed, 14 Mar 2018 17:45:01 +0100 Subject: [PATCH] allow empty STREAM frames at offset 0 --- internal/wire/stream_frame.go | 3 ++- internal/wire/stream_frame_test.go | 15 ++++++++++++++- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/internal/wire/stream_frame.go b/internal/wire/stream_frame.go index 2b1f7e8ba..d848127ae 100644 --- a/internal/wire/stream_frame.go +++ b/internal/wire/stream_frame.go @@ -76,7 +76,8 @@ func parseStreamFrame(r *bytes.Reader, version protocol.VersionNumber) (*StreamF if frame.Offset+frame.DataLen() > protocol.MaxByteCount { 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 frame, nil diff --git a/internal/wire/stream_frame_test.go b/internal/wire/stream_frame_test.go index 206abff9a..d0e1eb13b 100644 --- a/internal/wire/stream_frame_test.go +++ b/internal/wire/stream_frame_test.go @@ -56,10 +56,23 @@ var _ = Describe("STREAM frame (for IETF QUIC)", func() { 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 = append(data, encodeVarInt(0x1337)...) // stream ID 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) Expect(err).To(MatchError(qerr.EmptyStreamFrameNoFin)) })