diff options
author | Tianjie Xu <xunchang@google.com> | 2017-07-07 19:42:12 +0200 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2017-07-07 19:42:12 +0200 |
commit | b87a166a168913d4f387acae02dbbdc848f5e190 (patch) | |
tree | 7611ec2ced6ce5402030d718c9b2dad03591e4c9 /applypatch/imgdiff.cpp | |
parent | Merge "Update ScreenRecoveryUI::Draw* function signatures." (diff) | |
parent | Fix a rare failure for imgdiff when random data equals gzip header (diff) | |
download | android_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.cpp | 25 |
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). |