From: Andrew Gerrand Date: Fri, 22 Jul 2011 04:57:17 +0000 (+1000) Subject: archive/zip: handle zip files with more than 65535 files X-Git-Tag: weekly.2011-07-29~86 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=38e512824336971bcb3d067ad46d01728501b959;p=gostls13.git archive/zip: handle zip files with more than 65535 files R=r CC=golang-dev https://golang.org/cl/4812048 --- diff --git a/src/pkg/archive/zip/reader.go b/src/pkg/archive/zip/reader.go index 7deff117cb..98d4fb9943 100644 --- a/src/pkg/archive/zip/reader.go +++ b/src/pkg/archive/zip/reader.go @@ -80,19 +80,33 @@ func (z *Reader) init(r io.ReaderAt, size int64) os.Error { return err } z.r = r - z.File = make([]*File, end.directoryRecords) + z.File = make([]*File, 0, end.directoryRecords) z.Comment = end.comment rs := io.NewSectionReader(r, 0, size) if _, err = rs.Seek(int64(end.directoryOffset), os.SEEK_SET); err != nil { return err } buf := bufio.NewReader(rs) - for i := range z.File { - z.File[i] = &File{zipr: r, zipsize: size} - if err := readDirectoryHeader(z.File[i], buf); err != nil { + + // The count of files inside a zip is truncated to fit in a uint16. + // Gloss over this by reading headers until we encounter + // a bad one, and then only report a FormatError if + // the file count modulo 65536 is incorrect. + for { + f := &File{zipr: r, zipsize: size} + err := readDirectoryHeader(f, buf) + if err == FormatError { + break + } + if err != nil { return err } + z.File = append(z.File, f) } + if uint16(len(z.File)) != end.directoryRecords { + return FormatError + } + return nil }