summaryrefslogtreecommitdiffstats
path: root/applypatch/imgdiff.cpp
diff options
context:
space:
mode:
authorTianjie Xu <xunchang@google.com>2017-07-07 19:42:12 +0200
committerGerrit Code Review <noreply-gerritcodereview@google.com>2017-07-07 19:42:12 +0200
commitb87a166a168913d4f387acae02dbbdc848f5e190 (patch)
tree7611ec2ced6ce5402030d718c9b2dad03591e4c9 /applypatch/imgdiff.cpp
parentMerge "Update ScreenRecoveryUI::Draw* function signatures." (diff)
parentFix a rare failure for imgdiff when random data equals gzip header (diff)
downloadandroid_bootable_recovery-b87a166a168913d4f387acae02dbbdc848f5e190.tar
android_bootable_recovery-b87a166a168913d4f387acae02dbbdc848f5e190.tar.gz
android_bootable_recovery-b87a166a168913d4f387acae02dbbdc848f5e190.tar.bz2
android_bootable_recovery-b87a166a168913d4f387acae02dbbdc848f5e190.tar.lz
android_bootable_recovery-b87a166a168913d4f387acae02dbbdc848f5e190.tar.xz
android_bootable_recovery-b87a166a168913d4f387acae02dbbdc848f5e190.tar.zst
android_bootable_recovery-b87a166a168913d4f387acae02dbbdc848f5e190.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).