diff options
Diffstat (limited to 'libgo/go/archive/zip/zip_test.go')
-rw-r--r-- | libgo/go/archive/zip/zip_test.go | 36 |
1 files changed, 34 insertions, 2 deletions
diff --git a/libgo/go/archive/zip/zip_test.go b/libgo/go/archive/zip/zip_test.go index 32a16a79efb..f00ff47d37e 100644 --- a/libgo/go/archive/zip/zip_test.go +++ b/libgo/go/archive/zip/zip_test.go @@ -229,10 +229,11 @@ func TestZip64(t *testing.T) { t.Skip("slow test; skipping") } const size = 1 << 32 // before the "END\n" part - testZip64(t, size) + buf := testZip64(t, size) + testZip64DirectoryRecordLength(buf, t) } -func testZip64(t testing.TB, size int64) { +func testZip64(t testing.TB, size int64) *rleBuffer { const chunkSize = 1024 chunks := int(size / chunkSize) // write 2^32 bytes plus "END\n" to a zip file @@ -302,6 +303,37 @@ func testZip64(t testing.TB, size int64) { if got, want := f0.UncompressedSize64, uint64(size)+uint64(len(end)); got != want { t.Errorf("UncompressedSize64 %d, want %d", got, want) } + + return buf +} + +// Issue 9857 +func testZip64DirectoryRecordLength(buf *rleBuffer, t *testing.T) { + d := make([]byte, 1024) + if _, err := buf.ReadAt(d, buf.Size()-int64(len(d))); err != nil { + t.Fatal("read:", err) + } + + sigOff := findSignatureInBlock(d) + dirOff, err := findDirectory64End(buf, buf.Size()-int64(len(d))+int64(sigOff)) + if err != nil { + t.Fatal("findDirectory64End:", err) + } + + d = make([]byte, directory64EndLen) + if _, err := buf.ReadAt(d, dirOff); err != nil { + t.Fatal("read:", err) + } + + b := readBuf(d) + if sig := b.uint32(); sig != directory64EndSignature { + t.Fatalf("Expected directory64EndSignature (%d), got %d", directory64EndSignature, sig) + } + + size := b.uint64() + if size != directory64EndLen-12 { + t.Fatalf("Expected length of %d, got %d", directory64EndLen-12, size) + } } func testInvalidHeader(h *FileHeader, t *testing.T) { |