mirror of
https://github.com/golang/go
synced 2024-11-11 23:20:24 -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:
parent
83d5402443
commit
6a88f1c4cb
@ -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) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 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)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user