]> Cypherpunks repositories - gostls13.git/commitdiff
bytes: re-slice buffer to its previous length after call to grow()
authorDave Russell <forfuncsake@gmail.com>
Sat, 19 May 2018 00:54:43 +0000 (00:54 +0000)
committerBrad Fitzpatrick <bradfitz@golang.org>
Tue, 29 May 2018 19:46:33 +0000 (19:46 +0000)
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>

src/bytes/buffer.go
src/bytes/buffer_test.go

index dc9d5e95d32ba1c457bbf12e6e011f493397da0b..a2eca2ed129bbf131b9ef6eccf480cf24eac65fb 100644 (file)
@@ -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)
index e4bbc12f6a13524f6009c805468a5d7574b1a276..acbe5ca0c49e2127b2f6abdca414d67f607094bf 100644 (file)
@@ -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() {