From 546ba27013a6045f0dbfc40eb0f7912edf111255 Mon Sep 17 00:00:00 2001 From: Lucas Clemente Date: Wed, 13 Jul 2016 13:29:25 +0200 Subject: [PATCH] add an error when attempting to write empty stream frames --- frames/stream_frame.go | 4 ++++ frames/stream_frame_test.go | 10 ++++++++++ 2 files changed, 14 insertions(+) diff --git a/frames/stream_frame.go b/frames/stream_frame.go index dc337691c..cfdb73a01 100644 --- a/frames/stream_frame.go +++ b/frames/stream_frame.go @@ -87,6 +87,10 @@ func ParseStreamFrame(r *bytes.Reader) (*StreamFrame, error) { // WriteStreamFrame writes a stream frame. func (f *StreamFrame) Write(b *bytes.Buffer, version protocol.VersionNumber) error { + if len(f.Data) == 0 && !f.FinBit { + return errors.New("StreamFrame: attempting to write empty frame without FIN") + } + typeByte := uint8(0x80) // sets the leftmost bit to 1 if f.FinBit { diff --git a/frames/stream_frame_test.go b/frames/stream_frame_test.go index 35ac5cd04..a00bbeb31 100644 --- a/frames/stream_frame_test.go +++ b/frames/stream_frame_test.go @@ -78,12 +78,21 @@ var _ = Describe("StreamFrame", func() { Expect(b.Bytes()[0] & 0x40).To(Equal(byte(0x40))) }) + It("errors when length is zero and FIN is not set", func() { + b := &bytes.Buffer{} + err := (&StreamFrame{ + StreamID: 1, + }).Write(b, 0) + Expect(err).To(MatchError("StreamFrame: attempting to write empty frame without FIN")) + }) + It("has proper min length for a short StreamID and a short offset", func() { b := &bytes.Buffer{} f := &StreamFrame{ StreamID: 1, Data: []byte{}, Offset: 0, + FinBit: true, } err := f.Write(b, 0) Expect(err).ToNot(HaveOccurred()) @@ -96,6 +105,7 @@ var _ = Describe("StreamFrame", func() { StreamID: 0xDECAFBAD, Data: []byte{}, Offset: 0xDEADBEEFCAFE, + FinBit: true, } err := f.Write(b, 0) Expect(err).ToNot(HaveOccurred())