summaryrefslogtreecommitdiffstats
path: root/applypatch
diff options
context:
space:
mode:
authorandroid-build-team Robot <android-build-team-robot@google.com>2017-07-08 00:01:47 +0200
committerandroid-build-team Robot <android-build-team-robot@google.com>2017-07-08 00:01:47 +0200
commite7935db536bcdf15c809d8ee4a6cd83173f20914 (patch)
tree8904ae3f22500120dac574cdc1c074443b66705c /applypatch
parentrelease-request-d9dc98f7-19b2-484c-b4d1-f35dc43e9c05-for-git_oc-mr1-release-4152006 snap-temp-L91700000079405440 (diff)
parentMerge "Fix a rare failure for imgdiff when random data equals gzip header" am: b87a166a16 am: 8542502f1f am: 233f4b0b4b (diff)
downloadandroid_bootable_recovery-e7935db536bcdf15c809d8ee4a6cd83173f20914.tar
android_bootable_recovery-e7935db536bcdf15c809d8ee4a6cd83173f20914.tar.gz
android_bootable_recovery-e7935db536bcdf15c809d8ee4a6cd83173f20914.tar.bz2
android_bootable_recovery-e7935db536bcdf15c809d8ee4a6cd83173f20914.tar.lz
android_bootable_recovery-e7935db536bcdf15c809d8ee4a6cd83173f20914.tar.xz
android_bootable_recovery-e7935db536bcdf15c809d8ee4a6cd83173f20914.tar.zst
android_bootable_recovery-e7935db536bcdf15c809d8ee4a6cd83173f20914.zip
Diffstat (limited to 'applypatch')
-rw-r--r--applypatch/imgdiff.cpp25
1 files changed, 14 insertions, 11 deletions
diff --git a/applypatch/imgdiff.cpp b/applypatch/imgdiff.cpp
index 41d73ab98..fc240644f 100644
--- a/applypatch/imgdiff.cpp
+++ b/applypatch/imgdiff.cpp
@@ -693,6 +693,20 @@ static bool ReadImage(const char* filename, std::vector<ImageChunk>* chunks,
continue;
}
+ // The footer contains the size of the uncompressed data. Double-check to make sure that it
+ // matches the size of the data we got when we actually did the decompression.
+ size_t footer_index = pos + raw_data_len + GZIP_FOOTER_LEN - 4;
+ if (sz - footer_index < 4) {
+ printf("Warning: invalid footer position; treating as a nomal chunk\n");
+ continue;
+ }
+ size_t footer_size = get_unaligned<uint32_t>(img->data() + footer_index);
+ if (footer_size != uncompressed_len) {
+ printf("Warning: footer size %zu != decompressed size %zu; treating as a nomal chunk\n",
+ footer_size, uncompressed_len);
+ continue;
+ }
+
ImageChunk body(CHUNK_DEFLATE, pos, img, raw_data_len);
uncompressed_data.resize(uncompressed_len);
body.SetUncompressedData(std::move(uncompressed_data));
@@ -704,17 +718,6 @@ static bool ReadImage(const char* filename, std::vector<ImageChunk>* chunks,
chunks->emplace_back(CHUNK_NORMAL, pos, img, GZIP_FOOTER_LEN);
pos += GZIP_FOOTER_LEN;
-
- // The footer (that we just skipped over) contains the size of
- // the uncompressed data. Double-check to make sure that it
- // matches the size of the data we got when we actually did
- // the decompression.
- size_t footer_size = get_unaligned<uint32_t>(img->data() + pos - 4);
- if (footer_size != body.DataLengthForPatch()) {
- printf("Error: footer size %zu != decompressed size %zu\n", footer_size,
- body.GetRawDataLength());
- return false;
- }
} else {
// Use a normal chunk to take all the contents until the next gzip chunk (or EOF); we expect
// the number of chunks to be small (5 for typical boot and recovery images).