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:
parent
226fb099d9
commit
38e5128243
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user