Commit 6a88f1c4 authored by Rob Pike's avatar Rob Pike

bytes.Buffer: read of 0 bytes at EOF shouldn't be an EOF

This corner case arose doing an RPC with a empty-slice payload. Ouch.

R=golang-dev, iant
CC=golang-dev
https://golang.org/cl/5505073
parent 83d54024
...@@ -200,13 +200,16 @@ func (b *Buffer) WriteRune(r rune) (n int, err error) { ...@@ -200,13 +200,16 @@ func (b *Buffer) WriteRune(r rune) (n int, err error) {
// Read reads the next len(p) bytes from the buffer or until the buffer // Read reads the next len(p) bytes from the buffer or until the buffer
// is drained. The return value n is the number of bytes read. If the // is drained. The return value n is the number of bytes read. If the
// buffer has no data to return, err is io.EOF even if len(p) is zero; // buffer has no data to return, err is io.EOF (unless len(p) is zero);
// otherwise it is nil. // otherwise it is nil.
func (b *Buffer) Read(p []byte) (n int, err error) { func (b *Buffer) Read(p []byte) (n int, err error) {
b.lastRead = opInvalid b.lastRead = opInvalid
if b.off >= len(b.buf) { if b.off >= len(b.buf) {
// Buffer is empty, reset to recover space. // Buffer is empty, reset to recover space.
b.Truncate(0) b.Truncate(0)
if len(p) == 0 {
return
}
return 0, io.EOF return 0, io.EOF
} }
n = copy(p, b.buf[b.off:]) n = copy(p, b.buf[b.off:])
......
...@@ -373,3 +373,16 @@ func TestReadBytes(t *testing.T) { ...@@ -373,3 +373,16 @@ func TestReadBytes(t *testing.T) {
} }
} }
} }
// Was a bug: used to give EOF reading empty slice at EOF.
func TestReadEmptyAtEOF(t *testing.T) {
b := new(Buffer)
slice := make([]byte, 0)
n, err := b.Read(slice)
if err != nil {
t.Errorf("read error: %v", err)
}
if n != 0 {
t.Errorf("wrong count; got %d want 0", n)
}
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment