Fix a rare failure for imgdiff when random data equals gzip header
In a rare case, a random chunk will pass both the gzip header check and the inflation process; but fail the uncompressed length check in the footer. This leads to a imgdiff failure. So, we should treat this chunk as 'normal' instead of 'inflated' while generating the patch. Bug: 63334984 Test: imgdiff generates patch successfully on previous failing images. Change-Id: Ice84f22d3653bce9756bda91e70528c0d2f264a0
This commit is contained in:
@@ -328,6 +328,39 @@ TEST(ImgdiffTest, image_mode_simple) {
|
||||
verify_patched_image(src, patch, tgt);
|
||||
}
|
||||
|
||||
TEST(ImgdiffTest, image_mode_bad_gzip) {
|
||||
// Modify the uncompressed length in the gzip footer.
|
||||
const std::vector<char> src_data = { 'a', 'b', 'c', 'd', 'e', 'f', 'g',
|
||||
'h', '\x1f', '\x8b', '\x08', '\x00', '\xc4', '\x1e',
|
||||
'\x53', '\x58', '\x00', '\x03', '\xab', '\xa8', '\xac',
|
||||
'\x02', '\x00', '\x67', '\xba', '\x8e', '\xeb', '\x03',
|
||||
'\xff', '\xff', '\xff' };
|
||||
const std::string src(src_data.cbegin(), src_data.cend());
|
||||
TemporaryFile src_file;
|
||||
ASSERT_TRUE(android::base::WriteStringToFile(src, src_file.path));
|
||||
|
||||
// Modify the uncompressed length in the gzip footer.
|
||||
const std::vector<char> tgt_data = {
|
||||
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'x', 'y', 'z', '\x1f', '\x8b',
|
||||
'\x08', '\x00', '\x62', '\x1f', '\x53', '\x58', '\x00', '\x03', '\xab', '\xa8', '\xa8', '\xac',
|
||||
'\xac', '\xaa', '\x02', '\x00', '\x96', '\x30', '\x06', '\xb7', '\x06', '\xff', '\xff', '\xff'
|
||||
};
|
||||
const std::string tgt(tgt_data.cbegin(), tgt_data.cend());
|
||||
TemporaryFile tgt_file;
|
||||
ASSERT_TRUE(android::base::WriteStringToFile(tgt, tgt_file.path));
|
||||
|
||||
TemporaryFile patch_file;
|
||||
std::vector<const char*> args = {
|
||||
"imgdiff", src_file.path, tgt_file.path, patch_file.path,
|
||||
};
|
||||
ASSERT_EQ(0, imgdiff(args.size(), args.data()));
|
||||
|
||||
// Verify.
|
||||
std::string patch;
|
||||
ASSERT_TRUE(android::base::ReadFileToString(patch_file.path, &patch));
|
||||
verify_patched_image(src, patch, tgt);
|
||||
}
|
||||
|
||||
TEST(ImgdiffTest, image_mode_different_num_chunks) {
|
||||
// src: "abcdefgh" + gzipped "xyz" (echo -n "xyz" | gzip -f | hd) + gzipped "test".
|
||||
const std::vector<char> src_data = {
|
||||
|
||||
Reference in New Issue
Block a user