aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2020-02-21 00:57:17 +0000
committerAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>2020-02-21 00:57:17 +0000
commitf41ef119872c6595e7711ca9346131eb8d40ac8f (patch)
treec00a905e82383a0958dbd9f7fd3ab99c3ee573dc
parent0dba8aae044eb48a9835cddc63100a5048bc240e (diff)
parente9a670bd03dce467c696bf2eccfed29b03586c59 (diff)
downloadpuffin-android11-qpr1-c-release.tar.gz
Merge "Don't return false if there was no compressed deflate in a stream" am: f15730787e am: ce7d7051ea am: e9a670bd03r_aml_301500702android-mainline-12.0.0_r55android-mainline-11.0.0_r9android-mainline-11.0.0_r8android-mainline-11.0.0_r7android-mainline-11.0.0_r6android-mainline-11.0.0_r5android-mainline-11.0.0_r45android-mainline-11.0.0_r44android-mainline-11.0.0_r43android-mainline-11.0.0_r42android-mainline-11.0.0_r41android-mainline-11.0.0_r40android-mainline-11.0.0_r4android-mainline-11.0.0_r39android-mainline-11.0.0_r38android-mainline-11.0.0_r37android-mainline-11.0.0_r36android-mainline-11.0.0_r35android-mainline-11.0.0_r34android-mainline-11.0.0_r33android-mainline-11.0.0_r32android-mainline-11.0.0_r31android-mainline-11.0.0_r30android-mainline-11.0.0_r3android-mainline-11.0.0_r29android-mainline-11.0.0_r28android-mainline-11.0.0_r27android-mainline-11.0.0_r26android-mainline-11.0.0_r25android-mainline-11.0.0_r24android-mainline-11.0.0_r23android-mainline-11.0.0_r22android-mainline-11.0.0_r21android-mainline-11.0.0_r20android-mainline-11.0.0_r2android-mainline-11.0.0_r19android-mainline-11.0.0_r18android-mainline-11.0.0_r17android-mainline-11.0.0_r16android-mainline-11.0.0_r15android-mainline-11.0.0_r14android-mainline-11.0.0_r13android-mainline-11.0.0_r12android-mainline-11.0.0_r10android-mainline-11.0.0_r1android-11.0.0_r48android-11.0.0_r47android-11.0.0_r46android-11.0.0_r45android-11.0.0_r44android-11.0.0_r43android-11.0.0_r42android-11.0.0_r41android-11.0.0_r40android-11.0.0_r39android-11.0.0_r38android-11.0.0_r37android-11.0.0_r36android-11.0.0_r35android-11.0.0_r34android-11.0.0_r33android-11.0.0_r32android-11.0.0_r31android-11.0.0_r30android-11.0.0_r29android-11.0.0_r28android-11.0.0_r27android-11.0.0_r26android-11.0.0_r24android-11.0.0_r23android-11.0.0_r22android-11.0.0_r21android-11.0.0_r20android-11.0.0_r19android-11.0.0_r18android-11.0.0_r16android11-qpr3-s1-releaseandroid11-qpr3-releaseandroid11-qpr2-releaseandroid11-qpr1-s2-releaseandroid11-qpr1-s1-releaseandroid11-qpr1-releaseandroid11-qpr1-d-s1-releaseandroid11-qpr1-d-releaseandroid11-qpr1-c-releaseandroid11-mainline-tethering-releaseandroid11-mainline-sparse-2021-jan-releaseandroid11-mainline-sparse-2020-dec-releaseandroid11-mainline-releaseandroid11-mainline-permission-releaseandroid11-mainline-os-statsd-releaseandroid11-mainline-networkstack-releaseandroid11-mainline-media-swcodec-releaseandroid11-mainline-media-releaseandroid11-mainline-extservices-releaseandroid11-mainline-documentsui-releaseandroid11-mainline-conscrypt-releaseandroid11-mainline-cellbroadcast-releaseandroid11-mainline-captiveportallogin-releaseandroid11-devandroid11-d2-releaseandroid11-d1-b-release
Change-Id: Icb7f13fc54ded200a305d71c133189ea1fb8af2a
-rw-r--r--src/utils.cc26
1 files changed, 17 insertions, 9 deletions
diff --git a/src/utils.cc b/src/utils.cc
index d0aece0..b9b06c1 100644
--- a/src/utils.cc
+++ b/src/utils.cc
@@ -7,6 +7,7 @@
#include <inttypes.h>
#include <algorithm>
+#include <iterator>
#include <set>
#include <string>
#include <vector>
@@ -176,16 +177,24 @@ bool LocateDeflatesInZlibBlocks(const string& file_path,
return true;
}
+namespace {
// For more information about gzip format, refer to RFC 1952 located at:
// https://www.ietf.org/rfc/rfc1952.txt
+bool IsValidGzipHeader(const uint8_t* header, size_t size) {
+ // Each gzip entry has the following format magic header:
+ // 0 1 0x1F
+ // 1 1 0x8B
+ // 2 1 compression method (8 denotes deflate)
+ static const uint8_t magic[] = {0x1F, 0x8B, 8};
+ return size >= 10 && std::equal(std::begin(magic), std::end(magic), header);
+}
+} // namespace
+
bool LocateDeflatesInGzip(const Buffer& data, vector<BitExtent>* deflates) {
+ TEST_AND_RETURN_FALSE(IsValidGzipHeader(data.data(), data.size()));
uint64_t member_start = 0;
- while (member_start + 10 <= data.size() && data[member_start + 0] == 0x1F &&
- data[member_start + 1] == 0x8B && data[member_start + 2] == 8) {
- // Each member entry has the following format
- // 0 1 0x1F
- // 1 1 0x8B
- // 2 1 compression method (8 denotes deflate)
+ do {
+ // After the magic header, the gzip contains:
// 3 1 set of flags
// 4 4 modification time
// 8 1 extra flags
@@ -234,9 +243,8 @@ bool LocateDeflatesInGzip(const Buffer& data, vector<BitExtent>* deflates) {
TEST_AND_RETURN_FALSE(offset + 8 <= data.size());
offset += 8;
member_start = offset;
- }
- // Return true if we've successfully parsed at least one gzip.
- return member_start != 0;
+ } while (IsValidGzipHeader(&data[member_start], data.size() - member_start));
+ return true;
}
// For more information about the zip format, refer to