Bläddra i källkod

Merge pull request #8237 from dmcgowan/tarsum_buffer_fix

tarsum: fix panic with dynamic buffer
Victor Vieux 10 år sedan
förälder
incheckning
f721075283
2 ändrade filer med 18 tillägg och 2 borttagningar
  1. 2 2
      pkg/tarsum/tarsum.go
  2. 16 0
      pkg/tarsum/tarsum_test.go

+ 2 - 2
pkg/tarsum/tarsum.go

@@ -179,7 +179,7 @@ func (ts *tarSum) Read(buf []byte) (int, error) {
 	if ts.finished {
 		return ts.bufWriter.Read(buf)
 	}
-	if ts.bufData == nil {
+	if len(ts.bufData) < len(buf) {
 		switch {
 		case len(buf) <= buf8K:
 			ts.bufData = make([]byte, buf8K)
@@ -191,7 +191,7 @@ func (ts *tarSum) Read(buf []byte) (int, error) {
 			ts.bufData = make([]byte, len(buf))
 		}
 	}
-	buf2 := ts.bufData[:len(buf)-1]
+	buf2 := ts.bufData[:len(buf)]
 
 	n, err := ts.tarR.Read(buf2)
 	if err != nil {

+ 16 - 0
pkg/tarsum/tarsum_test.go

@@ -274,6 +274,22 @@ func TestTarSums(t *testing.T) {
 			t.Errorf("%q :: %q", err, layer.filename)
 			continue
 		}
+
+		// Read variable number of bytes to test dynamic buffer
+		dBuf := make([]byte, 1)
+		_, err = ts.Read(dBuf)
+		if err != nil {
+			t.Errorf("failed to read 1B from %s: %s", layer.filename, err)
+			continue
+		}
+		dBuf = make([]byte, 16*1024)
+		_, err = ts.Read(dBuf)
+		if err != nil {
+			t.Errorf("failed to read 16KB from %s: %s", layer.filename, err)
+			continue
+		}
+
+		// Read and discard remaining bytes
 		_, err = io.Copy(ioutil.Discard, ts)
 		if err != nil {
 			t.Errorf("failed to copy from %s: %s", layer.filename, err)