correctly treat nils and empty slices in stream.Write

This commit is contained in:
Marten Seemann
2016-08-16 17:25:27 +07:00
parent 4f3f1065cb
commit f0f500a218
2 changed files with 22 additions and 1 deletions

View File

@@ -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
}

View File

@@ -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() {