]> Cypherpunks repositories - gostls13.git/commitdiff
archive/zip: handle extra data headers with no body
authorDave Cheney <dave@cheney.net>
Sat, 17 Nov 2012 13:45:47 +0000 (00:45 +1100)
committerDave Cheney <dave@cheney.net>
Sat, 17 Nov 2012 13:45:47 +0000 (00:45 +1100)
Fixes #4393.

R=golang-dev, bradfitz
CC=golang-dev
https://golang.org/cl/6854058

src/pkg/archive/zip/reader.go
src/pkg/archive/zip/zip_test.go

index eed05beb014b5b7a9e05995728e5f2f44c245752..c10f29a8369ae0c1606d30e87c22459153050e45 100644 (file)
@@ -238,7 +238,7 @@ func readDirectoryHeader(f *File, r io.Reader) error {
 
        if len(f.Extra) > 0 {
                b := readBuf(f.Extra)
-               for len(b) > 4 { // need at least tag and size
+               for len(b) >= 4 { // need at least tag and size
                        tag := b.uint16()
                        size := b.uint16()
                        if int(size) > len(b) {
index 906ded6a918a1ba2d505e9c6bce35cee7fa74af8..0a18798a3f963d2cd15cbbc6995d1f157436607f 100644 (file)
@@ -195,6 +195,27 @@ func testInvalidHeader(h *FileHeader, t *testing.T) {
        }
 }
 
+func testValidHeader(h *FileHeader, t *testing.T) {
+       var buf bytes.Buffer
+       z := NewWriter(&buf)
+
+       f, err := z.CreateHeader(h)
+       if err != nil {
+               t.Fatalf("error creating header: %v", err)
+       }
+       if _, err := f.Write([]byte("hi")); err != nil {
+               t.Fatalf("error writing content: %v", err)
+       }
+       if err := z.Close(); err != nil {
+               t.Fatalf("error closing zip writer: %v", err)
+       }
+
+       b := buf.Bytes()
+       if _, err = NewReader(bytes.NewReader(b), int64(len(b))); err != nil {
+               t.Fatalf("got %v, expected nil", err)
+       }
+}
+
 // Issue 4302.
 func TestHeaderInvalidTagAndSize(t *testing.T) {
        const timeFormat = "20060102T150405.000.txt"
@@ -220,3 +241,17 @@ func TestHeaderTooShort(t *testing.T) {
        }
        testInvalidHeader(&h, t)
 }
+
+// Issue 4393. It is valid to have an extra data header
+// which contains no body.
+func TestZeroLengthHeader(t *testing.T) {
+       h := FileHeader{
+               Name:   "extadata.txt",
+               Method: Deflate,
+               Extra: []byte{
+                       85, 84, 5, 0, 3, 154, 144, 195, 77, // tag 21589 size 5
+                       85, 120, 0, 0, // tag 30805 size 0
+               },
+       }
+       testValidHeader(&h, t)
+}