From f0f500a218e69bd2b5f68da1e6c0109d747899e3 Mon Sep 17 00:00:00 2001 From: Marten Seemann Date: Tue, 16 Aug 2016 17:25:27 +0700 Subject: [PATCH] correctly treat nils and empty slices in stream.Write --- stream.go | 11 ++++++++++- stream_test.go | 12 ++++++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/stream.go b/stream.go index fb220ab8..58fd5481 100644 --- a/stream.go +++ b/stream.go @@ -127,6 +127,15 @@ func (s *stream) ReadByte() (byte, error) { func (s *stream) Write(p []byte) (int, error) { s.mutex.Lock() + defer s.mutex.Unlock() + + if s.err != nil { + return 0, s.err + } + + if len(p) == 0 { + return 0, nil + } s.dataForWriting = make([]byte, len(p)) copy(s.dataForWriting, p) @@ -137,10 +146,10 @@ func (s *stream) Write(p []byte) (int, error) { s.doneWritingOrErrCond.Wait() } - defer s.mutex.Unlock() if s.err != nil { return 0, s.err } + return len(p), nil } diff --git a/stream_test.go b/stream_test.go index 33c2c20d..40e9ac50 100644 --- a/stream_test.go +++ b/stream_test.go @@ -371,6 +371,18 @@ var _ = Describe("Stream", func() { s[0] = 'v' Expect(str.getDataForWriting(3)).To(Equal([]byte("foo"))) }) + + It("returns when given a nil input", func() { + n, err := str.Write(nil) + Expect(n).To(BeZero()) + Expect(err).ToNot(HaveOccurred()) + }) + + It("returns when given an empty slice", func() { + n, err := str.Write([]byte("")) + Expect(n).To(BeZero()) + Expect(err).ToNot(HaveOccurred()) + }) }) Context("closing", func() {