summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTianjie Xu <xunchang@google.com>2016-09-21 14:58:11 -0700
committergitbuildkicker <android-build@google.com>2016-11-03 14:00:24 -0700
commite8e6d11d9982a70ffaf07d7408994436b5ea788e (patch)
tree1c133ecda03951ff009b6104574f2d61af99bbce
parentdc7cf2204e8dbb2c825bad52f8504921e4a0f2b9 (diff)
downloadcore-e8e6d11d9982a70ffaf07d7408994436b5ea788e.tar.gz
Fix out of bound access in libziparchiveandroid-6.0.1_r79android-6.0.1_r78
The boundary check of an invalid EOCD record may succeed due to the overflow of uint32_t. Fix the check. Test: Open the crash.apk and libziparchive reports the offset error as expected. Bug: 31251826 Change-Id: I1d8092a19b73886a671bc9d291cfc27d65e3d236 (cherry picked from commit ae8180c06dee228cd1378c56afa6020ae98d8a24) (cherry picked from commit 1ee4892e66ba314131b7ecf17e98bb1762c4b84c)
-rw-r--r--libziparchive/zip_archive.cc7
1 files changed, 6 insertions, 1 deletions
diff --git a/libziparchive/zip_archive.cc b/libziparchive/zip_archive.cc
index cc39aa5fe..a17091f95 100644
--- a/libziparchive/zip_archive.cc
+++ b/libziparchive/zip_archive.cc
@@ -463,9 +463,14 @@ static int32_t MapCentralDirectory0(int fd, const char* debug_file_name,
* Grab the CD offset and size, and the number of entries in the
* archive and verify that they look reasonable.
*/
- if (eocd->cd_start_offset + eocd->cd_size > eocd_offset) {
+ if (static_cast<off64_t>(eocd->cd_start_offset) + eocd->cd_size > eocd_offset) {
ALOGW("Zip: bad offsets (dir %" PRIu32 ", size %" PRIu32 ", eocd %" PRId64 ")",
eocd->cd_start_offset, eocd->cd_size, static_cast<int64_t>(eocd_offset));
+#if defined(__ANDROID__)
+ if (eocd->cd_start_offset + eocd->cd_size <= eocd_offset) {
+ android_errorWriteLog(0x534e4554, "31251826");
+ }
+#endif
return kInvalidOffset;
}
if (eocd->num_records == 0) {