mirror of
https://github.com/golang/go
synced 2024-11-19 07:14:45 -07:00
archive/zip: accept bogus trailing zeros in extras
Popular tools both add incorrect trailing zeroes to the zip extras, and popular tools accept trailing zeros. We seemed to be the only ones being strict here. Stop being strict. :( Fixes #8186 LGTM=ruiu, adg, dave R=adg, ruiu, dave CC=frohrweck, golang-codereviews https://golang.org/cl/117550044
This commit is contained in:
parent
5c055e74d0
commit
77df26f0bd
@ -267,8 +267,13 @@ func readDirectoryHeader(f *File, r io.Reader) error {
|
|||||||
b = b[size:]
|
b = b[size:]
|
||||||
}
|
}
|
||||||
// Should have consumed the whole header.
|
// Should have consumed the whole header.
|
||||||
if len(b) != 0 {
|
// But popular zip & JAR creation tools are broken and
|
||||||
return ErrFormat
|
// may pad extra zeros at the end, so accept those
|
||||||
|
// too. See golang.org/issue/8186.
|
||||||
|
for _, v := range b {
|
||||||
|
if v != 0 {
|
||||||
|
return ErrFormat
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
@ -13,6 +13,7 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"regexp"
|
"regexp"
|
||||||
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
@ -508,3 +509,25 @@ func returnRecursiveZip() (r io.ReaderAt, size int64) {
|
|||||||
b := rZipBytes()
|
b := rZipBytes()
|
||||||
return bytes.NewReader(b), int64(len(b))
|
return bytes.NewReader(b), int64(len(b))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestIssue8186(t *testing.T) {
|
||||||
|
// Directory headers & data found in the TOC of a JAR file.
|
||||||
|
dirEnts := []string{
|
||||||
|
"PK\x01\x02\n\x00\n\x00\x00\b\x00\x004\x9d3?\xaa\x1b\x06\xf0\x81\x02\x00\x00\x81\x02\x00\x00-\x00\x05\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00res/drawable-xhdpi-v4/ic_actionbar_accept.png\xfe\xca\x00\x00\x00",
|
||||||
|
"PK\x01\x02\n\x00\n\x00\x00\b\x00\x004\x9d3?\x90K\x89\xc7t\n\x00\x00t\n\x00\x00\x0e\x00\x03\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xd1\x02\x00\x00resources.arsc\x00\x00\x00",
|
||||||
|
"PK\x01\x02\x14\x00\x14\x00\b\b\b\x004\x9d3?\xff$\x18\xed3\x03\x00\x00\xb4\b\x00\x00\x13\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00t\r\x00\x00AndroidManifest.xml",
|
||||||
|
"PK\x01\x02\x14\x00\x14\x00\b\b\b\x004\x9d3?\x14\xc5K\xab\x192\x02\x00\xc8\xcd\x04\x00\v\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xe8\x10\x00\x00classes.dex",
|
||||||
|
"PK\x01\x02\x14\x00\x14\x00\b\b\b\x004\x9d3?E\x96\nD\xac\x01\x00\x00P\x03\x00\x00&\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00:C\x02\x00res/layout/actionbar_set_wallpaper.xml",
|
||||||
|
"PK\x01\x02\x14\x00\x14\x00\b\b\b\x004\x9d3?Ļ\x14\xe3\xd8\x01\x00\x00\xd8\x03\x00\x00 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00:E\x02\x00res/layout/wallpaper_cropper.xml",
|
||||||
|
"PK\x01\x02\x14\x00\x14\x00\b\b\b\x004\x9d3?}\xc1\x15\x9eZ\x01\x00\x00!\x02\x00\x00\x14\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00`G\x02\x00META-INF/MANIFEST.MF",
|
||||||
|
"PK\x01\x02\x14\x00\x14\x00\b\b\b\x004\x9d3?\xe6\x98Ьo\x01\x00\x00\x84\x02\x00\x00\x10\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xfcH\x02\x00META-INF/CERT.SF",
|
||||||
|
"PK\x01\x02\x14\x00\x14\x00\b\b\b\x004\x9d3?\xbfP\x96b\x86\x04\x00\x00\xb2\x06\x00\x00\x11\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xa9J\x02\x00META-INF/CERT.RSA",
|
||||||
|
}
|
||||||
|
for i, s := range dirEnts {
|
||||||
|
var f File
|
||||||
|
err := readDirectoryHeader(&f, strings.NewReader(s))
|
||||||
|
if err != nil {
|
||||||
|
t.Errorf("error reading #%d: %v", i, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user