DO NOT MERGE : Fix build breakage due to 2d516d2d46b1b1.
Test: make
Test: zip_archive_test
Bug: 64211847
(cherry picked from commit 547c7d9a0b6651ace0ade7849661ba6c20770ae6)
(cherry picked from commit bfe4b5edb3097df66ddbf9639c3b3cd290734ed8)
Change-Id: Ide48ce66542e152d88520dcd6abcd104e48137f6
diff --git a/libziparchive/zip_archive.cc b/libziparchive/zip_archive.cc
index d0ba3d4..7cc9ac3 100644
--- a/libziparchive/zip_archive.cc
+++ b/libziparchive/zip_archive.cc
@@ -594,6 +594,8 @@
return result;
}
+static inline ssize_t ReadAtOffset(int fd, uint8_t* buf, size_t len, off64_t off);
+
/*
* Parses the Zip archive's Central Directory. Allocates and populates the
* hash table.
@@ -672,8 +674,8 @@
}
uint32_t lfh_start_bytes;
- if (!archive->mapped_zip.ReadAtOffset(reinterpret_cast<uint8_t*>(&lfh_start_bytes),
- sizeof(uint32_t), 0)) {
+ if (ReadAtOffset(archive->fd, reinterpret_cast<uint8_t*>(&lfh_start_bytes),
+ sizeof(uint32_t), 0) != sizeof(uint32_t)) {
ALOGW("Zip: Unable to read header for entry at offset == 0.");
return -1;
}
diff --git a/libziparchive/zip_archive_test.cc b/libziparchive/zip_archive_test.cc
index 4088843..2ae49a2 100644
--- a/libziparchive/zip_archive_test.cc
+++ b/libziparchive/zip_archive_test.cc
@@ -266,7 +266,7 @@
// Manual changes :
// [2] = 0xff // Corrupt the LFH signature of entry 0.
// [3] = 0xff // Corrupt the LFH signature of entry 0.
-static const std::vector<uint8_t> kZipFileWithBrokenLfhSignature{
+static const uint8_t kZipFileWithBrokenLfhSignature[] = {
//[lfh-sig-----------], [lfh contents---------------------------------
0x50, 0x4b, 0xff, 0xff, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x80,
//--------------------------------------------------------------------
@@ -297,12 +297,16 @@
0x00, 0x00, 0x43, 0x00, 0x00, 0x00, 0x00, 0x00};
TEST(ziparchive, BrokenLfhSignature) {
- TemporaryFile tmp_file;
- ASSERT_NE(-1, tmp_file.fd);
- ASSERT_TRUE(android::base::WriteFully(tmp_file.fd, &kZipFileWithBrokenLfhSignature[0],
- kZipFileWithBrokenLfhSignature.size()));
+ char kTempFilePattern[] = "zip_archive_input_XXXXXX";
+ int fd = make_temporary_file(kTempFilePattern);
+ ASSERT_NE(-1, fd);
+
+ ASSERT_EQ(static_cast<int32_t>(sizeof(kZipFileWithBrokenLfhSignature)),
+ TEMP_FAILURE_RETRY(write(fd, kZipFileWithBrokenLfhSignature,
+ sizeof(kZipFileWithBrokenLfhSignature))));
ZipArchiveHandle handle;
- ASSERT_EQ(-1, OpenArchiveFd(tmp_file.fd, "LeadingNonZipBytes", &handle));
+ ASSERT_EQ(-1, OpenArchiveFd(fd, "LeadingNonZipBytes", &handle));
+ close(fd);
}
int main(int argc, char** argv) {