Merge pull request #28552 from tomwilkie/fix-multi-read-seeker
Fix use of cap in MultiReadSeeker; possible data corruption bug.
This commit is contained in:
commit
423c014038
2 changed files with 25 additions and 4 deletions
|
@ -155,18 +155,18 @@ func (r *multiReadSeeker) Read(b []byte) (int, error) {
|
|||
r.pos = &pos{0, 0}
|
||||
}
|
||||
|
||||
bCap := int64(cap(b))
|
||||
bLen := int64(len(b))
|
||||
buf := bytes.NewBuffer(nil)
|
||||
var rdr io.ReadSeeker
|
||||
|
||||
for _, rdr = range r.readers[r.pos.idx:] {
|
||||
readBytes, err := io.CopyN(buf, rdr, bCap)
|
||||
readBytes, err := io.CopyN(buf, rdr, bLen)
|
||||
if err != nil && err != io.EOF {
|
||||
return -1, err
|
||||
}
|
||||
bCap -= readBytes
|
||||
bLen -= readBytes
|
||||
|
||||
if bCap == 0 {
|
||||
if bLen == 0 {
|
||||
break
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,6 +2,7 @@ package ioutils
|
|||
|
||||
import (
|
||||
"bytes"
|
||||
"encoding/binary"
|
||||
"fmt"
|
||||
"io"
|
||||
"io/ioutil"
|
||||
|
@ -188,3 +189,23 @@ func TestMultiReadSeekerCurAfterSet(t *testing.T) {
|
|||
t.Fatalf("reader size does not match, got %d, expected %d", size, mid+18)
|
||||
}
|
||||
}
|
||||
|
||||
func TestMultiReadSeekerSmallReads(t *testing.T) {
|
||||
readers := []io.ReadSeeker{}
|
||||
for i := 0; i < 10; i++ {
|
||||
integer := make([]byte, 4, 4)
|
||||
binary.BigEndian.PutUint32(integer, uint32(i))
|
||||
readers = append(readers, bytes.NewReader(integer))
|
||||
}
|
||||
|
||||
reader := MultiReadSeeker(readers...)
|
||||
for i := 0; i < 10; i++ {
|
||||
var integer uint32
|
||||
if err := binary.Read(reader, binary.BigEndian, &integer); err != nil {
|
||||
t.Fatalf("Read from NewMultiReadSeeker failed: %v", err)
|
||||
}
|
||||
if uint32(i) != integer {
|
||||
t.Fatalf("Read wrong value from NewMultiReadSeeker: %d != %d", i, integer)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue