Przeglądaj źródła

Merge pull request #28552 from tomwilkie/fix-multi-read-seeker

Fix use of cap in MultiReadSeeker; possible data corruption bug.
Vincent Demeester 8 lat temu
rodzic
commit
423c014038
2 zmienionych plików z 25 dodań i 4 usunięć
  1. 4 4
      pkg/ioutils/multireader.go
  2. 21 0
      pkg/ioutils/multireader_test.go

+ 4 - 4
pkg/ioutils/multireader.go

@@ -155,18 +155,18 @@ func (r *multiReadSeeker) Read(b []byte) (int, error) {
 		r.pos = &pos{0, 0}
 		r.pos = &pos{0, 0}
 	}
 	}
 
 
-	bCap := int64(cap(b))
+	bLen := int64(len(b))
 	buf := bytes.NewBuffer(nil)
 	buf := bytes.NewBuffer(nil)
 	var rdr io.ReadSeeker
 	var rdr io.ReadSeeker
 
 
 	for _, rdr = range r.readers[r.pos.idx:] {
 	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 {
 		if err != nil && err != io.EOF {
 			return -1, err
 			return -1, err
 		}
 		}
-		bCap -= readBytes
+		bLen -= readBytes
 
 
-		if bCap == 0 {
+		if bLen == 0 {
 			break
 			break
 		}
 		}
 	}
 	}

+ 21 - 0
pkg/ioutils/multireader_test.go

@@ -2,6 +2,7 @@ package ioutils
 
 
 import (
 import (
 	"bytes"
 	"bytes"
+	"encoding/binary"
 	"fmt"
 	"fmt"
 	"io"
 	"io"
 	"io/ioutil"
 	"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)
 		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)
+		}
+	}
+}