1
0
mirror of https://github.com/golang/go synced 2024-11-22 08:04:39 -07:00

archive/zip: handle zip files with more than 65535 files

R=r
CC=golang-dev
https://golang.org/cl/4812048
This commit is contained in:
Andrew Gerrand 2011-07-22 14:57:17 +10:00
parent 226fb099d9
commit 38e5128243

View File

@ -80,19 +80,33 @@ func (z *Reader) init(r io.ReaderAt, size int64) os.Error {
return err return err
} }
z.r = r z.r = r
z.File = make([]*File, end.directoryRecords) z.File = make([]*File, 0, end.directoryRecords)
z.Comment = end.comment z.Comment = end.comment
rs := io.NewSectionReader(r, 0, size) rs := io.NewSectionReader(r, 0, size)
if _, err = rs.Seek(int64(end.directoryOffset), os.SEEK_SET); err != nil { if _, err = rs.Seek(int64(end.directoryOffset), os.SEEK_SET); err != nil {
return err return err
} }
buf := bufio.NewReader(rs) buf := bufio.NewReader(rs)
for i := range z.File {
z.File[i] = &File{zipr: r, zipsize: size} // The count of files inside a zip is truncated to fit in a uint16.
if err := readDirectoryHeader(z.File[i], buf); err != nil { // 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 return err
} }
z.File = append(z.File, f)
} }
if uint16(len(z.File)) != end.directoryRecords {
return FormatError
}
return nil return nil
} }