]> Cypherpunks repositories - gostls13.git/commitdiff
archive/zip: fix returned error on truncated data descriptor
authorMichael Gehring <mg@ebfe.org>
Sat, 13 Jun 2015 09:38:34 +0000 (11:38 +0200)
committerAndrew Gerrand <adg@golang.org>
Sun, 14 Jun 2015 20:54:01 +0000 (20:54 +0000)
Return io.ErrUnexpectedEOF instead of io.EOF when reading a truncated
data descriptor.

Fixes #11146.

Change-Id: Ia1905955165fd38af3c557d1fa1703ed8be893e2
Reviewed-on: https://go-review.googlesource.com/11070
Reviewed-by: Andrew Gerrand <adg@golang.org>
src/archive/zip/reader.go
src/archive/zip/reader_test.go

index f68ab097231d730f53d8bb7fee0df702d2be708b..519748bac4006325228819074c7c984b9865063b 100644 (file)
@@ -184,7 +184,11 @@ func (r *checksumReader) Read(b []byte) (n int, err error) {
                }
                if r.desr != nil {
                        if err1 := readDataDescriptor(r.desr, r.f); err1 != nil {
-                               err = err1
+                               if err1 == io.EOF {
+                                       err = io.ErrUnexpectedEOF
+                               } else {
+                                       err = err1
+                               }
                        } else if r.hash.Sum32() != r.f.CRC32 {
                                err = ErrChecksum
                        }
index 4806b894585d63d26d6a04dea8700881b4abd6e0..547dd39048e21749faa6bebb159734bc4caf1599 100644 (file)
@@ -582,3 +582,26 @@ func TestIssue10956(t *testing.T) {
                t.Errorf("error = %v; want %q", err, want)
        }
 }
+
+// Verify we return ErrUnexpectedEOF when reading truncated data descriptor.
+func TestIssue11146(t *testing.T) {
+       data := []byte("PK\x03\x040000000000000000" +
+               "000000\x01\x00\x00\x000\x01\x00\x00\xff\xff0000" +
+               "0000000000000000PK\x01\x02" +
+               "0000\b0\b\x00000000000000" +
+               "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x000000PK\x05\x06\x00\x00" +
+               "\x00\x0000\x01\x0000008\x00\x00\x00\x00\x00")
+       z, err := NewReader(bytes.NewReader(data), int64(len(data)))
+       if err != nil {
+               t.Fatal(err)
+       }
+       r, err := z.File[0].Open()
+       if err != nil {
+               t.Fatal(err)
+       }
+       _, err = ioutil.ReadAll(r)
+       if err != io.ErrUnexpectedEOF {
+               t.Errorf("File[0] error = %v; want io.ErrUnexpectedEOF", err)
+       }
+       r.Close()
+}