diff options
author | Dave Russell <forfuncsake@gmail.com> | 2018-05-19 00:54:43 +0000 |
---|---|---|
committer | Brad Fitzpatrick <bradfitz@golang.org> | 2018-05-29 19:46:33 +0000 |
commit | 23b687eccbcc68f44acf34fd5971f0f5c04d90de (patch) | |
tree | 5fc7f99aebdc3c74a9580bcc4ee39cc23b9f6b8d /src/bytes | |
parent | ef53de8ba4d774e4eedb04192a9f03f28a9652e8 (diff) | |
download | go-23b687eccbcc68f44acf34fd5971f0f5c04d90de.tar.gz go-23b687eccbcc68f44acf34fd5971f0f5c04d90de.zip |
bytes: re-slice buffer to its previous length after call to grow()
Fixes #25435
The added test fails without the re-slice and passes with it.
Change-Id: I5ebc2a737285eb116ecc5938d8bf49050652830f
GitHub-Last-Rev: 454ddad7df8d56a1d0e05a999ed8277c5516ce01
GitHub-Pull-Request: golang/go#25436
Reviewed-on: https://go-review.googlesource.com/113495
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/bytes')
-rw-r--r-- | src/bytes/buffer.go | 1 | ||||
-rw-r--r-- | src/bytes/buffer_test.go | 33 |
2 files changed, 34 insertions, 0 deletions
diff --git a/src/bytes/buffer.go b/src/bytes/buffer.go index dc9d5e95d3..a2eca2ed12 100644 --- a/src/bytes/buffer.go +++ b/src/bytes/buffer.go @@ -202,6 +202,7 @@ func (b *Buffer) ReadFrom(r io.Reader) (n int64, err error) { b.lastRead = opInvalid for { i := b.grow(MinRead) + b.buf = b.buf[:i] m, e := r.Read(b.buf[i:cap(b.buf)]) if m < 0 { panic(errNegativeRead) diff --git a/src/bytes/buffer_test.go b/src/bytes/buffer_test.go index e4bbc12f6a..acbe5ca0c4 100644 --- a/src/bytes/buffer_test.go +++ b/src/bytes/buffer_test.go @@ -269,6 +269,39 @@ func TestReadFrom(t *testing.T) { } } +type panicReader struct{ panic bool } + +func (r panicReader) Read(p []byte) (int, error) { + if r.panic { + panic(nil) + } + return 0, io.EOF +} + +// Make sure that an empty Buffer remains empty when +// it is "grown" before a Read that panics +func TestReadFromPanicReader(t *testing.T) { + + // First verify non-panic behaviour + var buf Buffer + i, err := buf.ReadFrom(panicReader{}) + if err != nil { + t.Fatal(err) + } + if i != 0 { + t.Fatalf("unexpected return from bytes.ReadFrom (1): got: %d, want %d", i, 0) + } + check(t, "TestReadFromPanicReader (1)", &buf, "") + + // Confirm that when Reader panics, the emtpy buffer remains empty + var buf2 Buffer + defer func() { + recover() + check(t, "TestReadFromPanicReader (2)", &buf2, "") + }() + buf2.ReadFrom(panicReader{panic: true}) +} + func TestReadFromNegativeReader(t *testing.T) { var b Buffer defer func() { |