mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
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: 454ddad7df
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>
This commit is contained in:
parent
ef53de8ba4
commit
23b687eccb
2 changed files with 34 additions and 0 deletions
|
|
@ -202,6 +202,7 @@ func (b *Buffer) ReadFrom(r io.Reader) (n int64, err error) {
|
||||||
b.lastRead = opInvalid
|
b.lastRead = opInvalid
|
||||||
for {
|
for {
|
||||||
i := b.grow(MinRead)
|
i := b.grow(MinRead)
|
||||||
|
b.buf = b.buf[:i]
|
||||||
m, e := r.Read(b.buf[i:cap(b.buf)])
|
m, e := r.Read(b.buf[i:cap(b.buf)])
|
||||||
if m < 0 {
|
if m < 0 {
|
||||||
panic(errNegativeRead)
|
panic(errNegativeRead)
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
func TestReadFromNegativeReader(t *testing.T) {
|
||||||
var b Buffer
|
var b Buffer
|
||||||
defer func() {
|
defer func() {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue