summaryrefslogtreecommitdiffstats
path: root/applypatch/imgdiff.cpp
diff options
context:
space:
mode:
authorTianjie Xu <xunchang@google.com>2017-07-07 20:11:59 +0200
committerandroid-build-merger <android-build-merger@google.com>2017-07-07 20:11:59 +0200
commit79c1562dc918f52b82b8ec6e2da9c1916e8d018c (patch)
tree8904ae3f22500120dac574cdc1c074443b66705c /applypatch/imgdiff.cpp
parentRestructure vr_ui (diff)
parentMerge "Fix a rare failure for imgdiff when random data equals gzip header" am: b87a166a16 (diff)
downloadandroid_bootable_recovery-79c1562dc918f52b82b8ec6e2da9c1916e8d018c.tar
android_bootable_recovery-79c1562dc918f52b82b8ec6e2da9c1916e8d018c.tar.gz
android_bootable_recovery-79c1562dc918f52b82b8ec6e2da9c1916e8d018c.tar.bz2
android_bootable_recovery-79c1562dc918f52b82b8ec6e2da9c1916e8d018c.tar.lz
android_bootable_recovery-79c1562dc918f52b82b8ec6e2da9c1916e8d018c.tar.xz
android_bootable_recovery-79c1562dc918f52b82b8ec6e2da9c1916e8d018c.tar.zst
android_bootable_recovery-79c1562dc918f52b82b8ec6e2da9c1916e8d018c.zip
Diffstat (limited to 'applypatch/imgdiff.cpp')
-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).