From 48d865ace1cf3b95bfa9e9525ee51bb18738b10c Mon Sep 17 00:00:00 2001
From: Michael Gehring <mg@ebfe.org>
Date: Sat, 13 Jun 2015 11:38:34 +0200
Subject: [PATCH] archive/zip: fix returned error on truncated data descriptor

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      |  6 +++++-
 src/archive/zip/reader_test.go | 23 +++++++++++++++++++++++
 2 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/src/archive/zip/reader.go b/src/archive/zip/reader.go
index f68ab09723..519748bac4 100644
--- a/src/archive/zip/reader.go
+++ b/src/archive/zip/reader.go
@@ -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
 			}
diff --git a/src/archive/zip/reader_test.go b/src/archive/zip/reader_test.go
index 4806b89458..547dd39048 100644
--- a/src/archive/zip/reader_test.go
+++ b/src/archive/zip/reader_test.go
@@ -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()
+}
-- 
2.30.9