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
|
||||
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)
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue