aboutsummaryrefslogtreecommitdiff
path: root/src/bytes
diff options
context:
space:
mode:
authorDave Russell <forfuncsake@gmail.com>2018-05-19 00:54:43 +0000
committerBrad Fitzpatrick <bradfitz@golang.org>2018-05-29 19:46:33 +0000
commit23b687eccbcc68f44acf34fd5971f0f5c04d90de (patch)
tree5fc7f99aebdc3c74a9580bcc4ee39cc23b9f6b8d /src/bytes
parentef53de8ba4d774e4eedb04192a9f03f28a9652e8 (diff)
downloadgo-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.go1
-rw-r--r--src/bytes/buffer_test.go33
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() {