1
0
mirror of https://github.com/golang/go synced 2024-11-22 03:14:41 -07:00

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
This commit is contained in:
Rob Pike 2011-12-26 23:49:24 -08:00
parent 83d5402443
commit 6a88f1c4cb
2 changed files with 17 additions and 1 deletions

View File

@ -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:])

View File

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