soong_zip: set local header crc and size for symlinks
Getting a crc and size into the local header requires setting it
before writing the payload, or using a streaming data header after
the payload with the crc and size. Stored (uncompressed) entries
are not allowed to use a streaming data header.
Symlinks are always stored uncompressed, so set the crc and size
in the file header before writing the payload.
Also set the mode to 0777 to match the behavior of zip.
This relands I66c5d41f0a5b23b828d6a03a3790afedc5a97625 with fixes
for the size and mode.
Test: m checkbuild
Test: zipdetails on zip with symlink created with soong_zip has same
crc in local header and central header.
Test: Compare zipdetails output of zip containing symlink created
by soong_zip and by zip --symlinks -X.
Bug: 110716403
Change-Id: Iec0bc9056a0d9cdab76f015844aca9c711e72e5b
diff --git a/zip/zip.go b/zip/zip.go
index b7e3764..a89fa9f 100644
--- a/zip/zip.go
+++ b/zip/zip.go
@@ -788,13 +788,16 @@
Name: rel,
}
fileHeader.SetModTime(z.time)
- fileHeader.SetMode(0700 | os.ModeSymlink)
+ fileHeader.SetMode(0777 | os.ModeSymlink)
dest, err := os.Readlink(file)
if err != nil {
return err
}
+ fileHeader.UncompressedSize64 = uint64(len(dest))
+ fileHeader.CRC32 = crc32.ChecksumIEEE([]byte(dest))
+
ze := make(chan *zipEntry, 1)
futureReaders := make(chan chan io.Reader, 1)
futureReader := make(chan io.Reader, 1)