History log of /bootable/recovery/applypatch/imgdiff.cpp
Revision Date Author Comments (<<< Hide modified files) (Show modified files >>>)
572abbb81cfa12cddf742fa35cd8a4b9eebdc7d1 23-Feb-2018 Tianjie Xu <xunchang@google.com> Remove the assumption of target chunk size in imgdiff

In the split mode of imgdiff, we used to assume that the size of a split
target chunk is always greater than the blocksize i.e. 4096. This may
lead to the following assertion failure:
I0221 04:57:33.451323 818464 common.py:205 imgdiff F 02-21 04:57:33 821203 821203 imgdiff.cpp:999]
Check failed: tgt_size >= BLOCK_SIZE (tgt_size=476, BLOCK_SIZE=4096)

This CL removes the assumption and handles the edge cases.

Test: generate and verify the incremental update for TFs in the bug; unit test passes

Bug: 73757557
Bug: 73711365
Change-Id: Iadbb4ee658995f5856cd488f3793980881a59620
/bootable/recovery/applypatch/imgdiff.cpp
6e293c99c1c8818fd28edc8dcfc13b5e4f048188 16-Nov-2017 Tianjie Xu <xunchang@google.com> Switch imgdiff to libbase logging

Also add a verbose option. And we won't print messages of 'info'
severity unless '-v' is present.

Test: run imgdiff and check the logs.
Change-Id: I1b90874baea8e72e2a2323a0b63bc5d35e653e6b
/bootable/recovery/applypatch/imgdiff.cpp
3d24b7bca60dff1ca07d3ee60cc9749fc61e9b5d 24-Oct-2017 Treehugger Robot <treehugger-gerrit@google.com> Merge "Use SuffixArrayIndexInterface opaque type instead of the underlying data pointer."
fa188268e43ab75732a480d6b2ec748d9d0dbfae 10-Oct-2017 Alex Deymo <deymo@google.com> Use SuffixArrayIndexInterface opaque type instead of the underlying data pointer.

bsdiff interface is changing such that it hides the suffix array
pointer from the public interface. This allows to use a different
suffix array data size depending on the input size, running much faster
in the normal case.

Bug: 34220646
Test: `make checkbuild`; Ran an incremental update generation on a non-A/B device.
Change-Id: I78e766da56cf28bc7774b8c8e58527bc11d919fb
/bootable/recovery/applypatch/imgdiff.cpp
45685820029fb191fe8509418df91a049227ea3a 13-Oct-2017 Tao Bao <tbao@google.com> otautil: Move RangeSet implementation into rangeset.cpp.

Since it has grown much larger, users of the header shouldn't compile
and carry their full copies.

Also add missing header includes in imgdiff.cpp and imgdiff_test.cpp.

Test: mmma bootable/recovery
Test: recovery_unit_test; recovery_component_test; recovery_host_test
Change-Id: I88ca54171765e5606ab0d61580fbc1ada578fd7d
/bootable/recovery/applypatch/imgdiff.cpp
09e468f84cc245fba61d69165b4af8f1ec4cdfd5 29-Sep-2017 Tao Bao <tbao@google.com> Move rangeset.h and print_sha1.h into otautil.

Also drop the "bootable/recovery" path in LOCAL_C_INCLUDES from
applypatch modules.

Test: lunch aosp_{angler,bullhead,fugu,dragon,sailfish}-userdebug;
mmma bootable/recovery
Change-Id: Idd602a796894f971ee4f8fa3eafe36c42d9de986
/bootable/recovery/applypatch/imgdiff.cpp
82582b4562bd2ffa9ebe9d25ecdc6222b053d6ef 01-Sep-2017 Tianjie Xu <xunchang@google.com> Output split information for imgdiff when handling large apks

Add a mandatory option in imgdiff to write the split info (i.e.
patch_size, tgt_size, src_ranges) to file when handling large apks.
Therefore, the caller of imgdiff can create split transfers based on
the info.

Bug: 63542719
Test: unit tests pass
Change-Id: I853d55d1f999fd576474faa81077f7307f4d856d
/bootable/recovery/applypatch/imgdiff.cpp
2903cddb58f6ee99116e0751a2305f75f9a86461 19-Aug-2017 Tianjie Xu <xunchang@google.com> Improve imgdiff for large zip files

Due to the cache size limit for OTA generation, we used to split large
zip files linearly into pieces and do bsdiff on them. As a result, i) we
lose the advantage of imgdiff; ii) if there's an accidental order change
of some huge files inside the zip, we'll create an insanely large patch.

This patch splits the src&tgt more smartly based on the zip entry_name.
If the entry_name is empty or no matching source is found for a target
chunk, we'll skip adding its source and later do a bsdiff against the
whole split source image (this rarely happens in our use cases except
for the metadata inside a ziparchive).

After the split, the target pieces are continuous and block aligned,
while the sources pieces are mutually exclusive. (Some of the source
blocks may not be used if there's no matching entry_name in the target.)
Then we will generate patches accordingly between each split image
pairs.

Afterwards, if we apply imgpatch to each pair of split source/target
images and add up the patched result, we can get back the original
target image.

For example:
Input: [src_image, tgt_image]
Split: [src-0,tgt-0; src-1,tgt-1, src-2,tgt-2]
Diff: [ patch-0; patch-1; patch-2]

Patch: [(src-0,patch-0)=tgt-0; (src-1,patch-1)=tgt-1;
(src-2,patch-2)=tgt-2;]
Append: [tgt-0 + tgt-1 + tgt-2 = tgt_image]

Peformance:
For the small package in b/34220646, we decrease the patch size of
chrome.apk dramatically from 30M to 400K due to the order change of
two big .so files.

On two versions of angler, I also observe decent patch size decrease.
For chrome.apk, we reduced the size from 5.9M to 3.2M; and for
vevlet.apk from 8.0M to 6.5M.

Bug: 34220646
Test: recovery component test && apply imgdiff & imgpatch on two
chrome.apk
Change-Id: I145d802984fa805efbbac9d01a2e64d82ef9728b
/bootable/recovery/applypatch/imgdiff.cpp
57dd96199570beb29ea8b0f3934c594cd42e3043 18-Aug-2017 Tianjie Xu <xunchang@google.com> Move Image/ImageChunk/PatchChunk declaration into header files

1. Move the declaration of the Image classes to the header file to make
testing easier.
2. Also move rangeset.h to bootable/recovery to allow access in imgdiff.

Test: recovery component test
Change-Id: I68a863e60a3f2e7ae46ee48f48eb15391f5f4330
/bootable/recovery/applypatch/imgdiff.cpp
d82a2ed50bab5ea014bcf3b1e5541e21829b4ecb 09-Aug-2017 Tianjie Xu <xunchang@google.com> Add a new PatchChunk class in imgdiff

This way we can keep the input images const when calling
genetatepatches().

Test: recovery component test; diff and patch on chrome.apk; generate
recovery-from-boot.p for angler.
Change-Id: I65b5689b88f6719c6ede46bb82def0c4caeb8a61
/bootable/recovery/applypatch/imgdiff.cpp
6b03ba7902cd97e305d9354fd6a733ab0d2f10fe 19-Jul-2017 Tianjie Xu <xunchang@google.com> Refactor the imgdiff

This helps us to add a new mode to handle large APKs in the follow
up CL.

Changes include:
1. Create a new interface class 'Image'
1. Create subclasses 'ZipModeImage' and 'ImageModeImage' and move the
related functions there.

Bug: 63542719
Test: recovery_component_test passes
Change-Id: I7729b0ba39b19a9c84811636a60dd0a0b1acc2f0
/bootable/recovery/applypatch/imgdiff.cpp
14ebc1e5ae6968424eb242f3b0330f82e475a1e4 05-Jul-2017 Tianjie Xu <xunchang@google.com> 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
/bootable/recovery/applypatch/imgdiff.cpp
12b90553d784b9d4ddd1b48300af6345bdf1085f 07-Mar-2017 Tianjie Xu <xunchang@google.com> More cleanup to imgdiff & imgpatch

Also remove the utils in applypatch and replace them with the
corresponding libbase functions.

Test: recovery tests pass.
Change-Id: I77254c141bd3e7d3d6894c23b60e866009516f81
/bootable/recovery/applypatch/imgdiff.cpp
1ea84d6da97f4c4269ac16c4d332bbff3466b1b8 23-Feb-2017 Tianjie Xu <xunchang@google.com> Refractor the code for imgdiff

Put ImageChunk and some helper functions into a class. Also switch to
using std::vector instead of malloc.

Bug: 18606652
Test: imgdiff_test passed on host. Also generate a complete incremental OTA package.
The file content is the same and time consumption is similar.

Change-Id: Id603ada4e130ef521218400761a119001a86ca79
/bootable/recovery/applypatch/imgdiff.cpp
7ab9c3812daf486f46c83dec3e341bf668e9513f 01-Feb-2017 Tao Bao <tbao@google.com> Merge "bootable/recovery: cleanup compiler warnings (potential leak of memory)"
930edb666122d04ffb6a1ff1648181d5b08dda84 19-Jan-2017 Sen Jiang <senj@google.com> imgdiff: cache bsdiff suffix array in zip mode.

In zip mode, if a chunk is not deflate or its filename can't be found
in source chunks, the entire source file is used as old data for bsdiff,
To avoid repeatedly construct the suffix array used by bsdiff, we cache
the suffix array of the entire source file.

Bug: 34281147
Test: =time -v imgdiff -z Chrome-ORF74B.apk Chrome-ORF76B.apk Chrome.imgdiff
Change-Id: Ifd957ccecf7226fcb44dbf28c58969a06ef74f4b
/bootable/recovery/applypatch/imgdiff.cpp
d37ce8f0821758edc33ad9c42b0bf78ff29b365f 18-Dec-2016 Tao Bao <tbao@google.com> imgdiff: Fix an edge case that leads to infinite loop.

When the input image ends with the magic value sequence of 0x1f, 0x8b,
0x0b (optionally with 0x00), the image parsing code will be stuck in an
infinite loop.

Test: recovery_component_test passes.
Change-Id: Ie3629dfdc41360387b19cc3e0359c95ae4fb998e
/bootable/recovery/applypatch/imgdiff.cpp
97555da4a67d45ada0020c0ee58d1b280cb4b57d 15-Dec-2016 Tao Bao <tbao@google.com> Add tests for imgdiff.

Factor out libimgdiff static library for testing purpose.

This CL adds the imgdiff tests on host and on target both (similar to
libimgpatch). In practice, we only need imgdiff binary on host, and
libimgpatch on target. But they should build and pass tests on both
platforms.

Test: recovery_host_test passes; recovery_component_test passes.
Change-Id: I0eafb7faf727cdf70066310e845af6ee245d4f60
/bootable/recovery/applypatch/imgdiff.cpp
8b640ffabc3f7c81c94dcbba6fec3436f85383fb 07-Dec-2016 Rahul Chaudhry <rahulchaudhry@google.com> bootable/recovery: cleanup compiler warnings (potential leak of memory)

bootable/recovery/applypatch/imgdiff.cpp:195:5: warning: Potential leak
of memory pointed to by 'img' [clang-analyzer-unix.Malloc]

Bug: 26936282
Test: WITH_TIDY=1 WITH_STATIC_ANALYZER=1 mm
Change-Id: Ie79c780233ddfebf85686a24df3bf2561f831580
/bootable/recovery/applypatch/imgdiff.cpp
ef3bea15b8cb666387df0edc7dfa016b20bb3f87 01-Dec-2016 Tao Bao <tbao@google.com> Merge "bootable/recovery: cleanup compiler warnings (unused value)"
d255b661a18d9f2e69bf6a301224591a9b7e87a8 30-Nov-2016 Tao Bao <tbao@google.com> Merge "bootable/recovery: cleanup compiler warnings (potential leak of memory)"
a793c58208bc54fe83c5aa0e456a66ee2609e408 30-Nov-2016 Rahul Chaudhry <rahulchaudhry@google.com> bootable/recovery: cleanup compiler warnings (unused value)

bootable/recovery/applypatch/imgdiff.cpp:322:11: warning: Value stored to 'ret' during its initialization is never read [clang-analyzer-deadcode.DeadStores]
bootable/recovery/applypatch/imgdiff.cpp:447:11: warning: Value stored to 'ret' during its initialization is never read [clang-analyzer-deadcode.DeadStores]
bootable/recovery/applypatch/imgdiff.cpp:553:3: warning: Value stored to 'ret' is never read [clang-analyzer-deadcode.DeadStores]

Bug: 26936282
Test: WITH_TIDY=1 WITH_STATIC_ANALYZER=1 mm
Change-Id: I3f865e3e9b9d19e5ea5e8dfd2fe2c644254ffbb5
/bootable/recovery/applypatch/imgdiff.cpp
b29f23f7e7c791e7d8786de93d630a12e4250c71 09-Nov-2016 Rahul Chaudhry <rahulchaudhry@google.com> Use static_cast to cast pointers returned by malloc/calloc/realloc/mmap.

static_cast is preferable to reinterpret_cast when casting from void*
pointers returned by malloc/calloc/realloc/mmap calls.

Discovered while looking at compiler warnings (b/26936282).

Test: WITH_TIDY=1 WITH_STATIC_ANALYZER=1 mma
Change-Id: Iaffd537784aa857108f6981fdfd82d0496eb5592
Merged-In: I151642d5a60c94f312d0611576ad0143c249ba3d
/bootable/recovery/applypatch/imgdiff.cpp
3a5177b16d574c902183d1322367fe7db08fffc1 16-Nov-2016 Rahul Chaudhry <rahulchaudhry@google.com> bootable/recovery: cleanup compiler warnings (potential leak of memory)

bootable/recovery/applypatch/imgdiff.cpp:1065:3: warning: Potential leak of memory pointed to by 'patch_data'
bootable/recovery/applypatch/imgdiff.cpp:1065:3: warning: Potential leak of memory pointed to by 'patch_size'
bootable/recovery/applypatch/imgdiff.cpp:226:7: warning: Potential leak of memory pointed to by 'temp_entries'

Bug: 26936282
Test: WITH_TIDY=1 WITH_STATIC_ANALYZER=1 mm
Change-Id: I3cac945d7677d367934d5619ef7419daf6f48d6f
/bootable/recovery/applypatch/imgdiff.cpp
a0c40110281584fcfa22dc16e73622fa0e5b7a57 01-Jun-2016 Tao Bao <tbao@google.com> Revert "Fix memory/resource handling in imgdiff.cpp, using unique_ptr and vector."

This reverts commit 50a6f8c8335be920833d06e5dabd37de279c98a9.

A mix of new and free leads to memory corruptions.
/bootable/recovery/applypatch/imgdiff.cpp
50a6f8c8335be920833d06e5dabd37de279c98a9 21-May-2016 Adam Buchbinder <abuchbinder@google.com> Fix memory/resource handling in imgdiff.cpp, using unique_ptr and vector.

This fixes the following cppcheck reports:
[imgdiff.cpp:197]: (error) Memory leak: img
[imgdiff.cpp:386]: (error) Memory leak: img
[imgdiff.cpp:656]: (error) Memory leak: data
[imgdiff.cpp:664]: (error) Memory leak: data
[imgdiff.cpp:668]: (error) Memory leak: data
[imgdiff.cpp:668]: (error) Resource leak: f
[imgdiff.cpp:820]: (error) Memory leak: bonus_data
[imgdiff.cpp:824]: (error) Memory leak: bonus_data
[imgdiff.cpp:824]: (error) Resource leak: f
[imgdiff.cpp:847]: (error) Memory leak: bonus_data
[imgdiff.cpp:851]: (error) Memory leak: bonus_data
[imgdiff.cpp:856]: (error) Memory leak: bonus_data
[imgdiff.cpp:860]: (error) Memory leak: bonus_data
[imgdiff.cpp:227]: (error) Memory leak: temp_entries

Change-Id: I06f878d0b677a25328e0deb84f65f3b7212e24b1
(cherry picked from commit 51dc9444bcf8d8900a521795e873d07f6cd445ef)
/bootable/recovery/applypatch/imgdiff.cpp
2fffcb174b403959d87b400634bca343ce85d480 04-May-2016 Sen Jiang <senj@google.com> applypatch: Use bsdiff from external/bsdiff.

external/bsdiff uses divsufsort which is much faster, and also include
some bug fixes.

Bug: 26982501
Test: ./imgdiff_test.sh

Change-Id: I089a301c291ee55d79938c7a3ca6d509895440d1
/bootable/recovery/applypatch/imgdiff.cpp
fa4f1b75b6686f73a253536d6ce6deb3ed065148 12-Feb-2016 Sen Jiang <senj@google.com> imgdiff: don't fail if gzip is corrupted.

Treat it as a normal chunk if inflate() fails.

Test: run imgdiff on corrupted gzip and apply the patch
Bug: 27153028
Change-Id: Idcbb3c1360ec0774e6c7861b21d99af8ee10604a
/bootable/recovery/applypatch/imgdiff.cpp
696692a3c9fe4bd8879f98f3e85341303f85afd5 02-Feb-2016 Sen Jiang <senj@google.com> applypatch: Add a Makefile to build imgdiff in Chrome OS.

Also fixed some warnings and added check for target_len.

Test: mma; emerge-peppy imgdiff; emerge-nyan imgdiff; sudo emerge imgdiff
Bug: 26866274

Change-Id: Ifbcd3afd6701c769ccf626e33ed94461706f7ee6
/bootable/recovery/applypatch/imgdiff.cpp
0779fc98147a298eda6475c7744c5957ac382740 10-Dec-2015 David Riley <davidriley@google.com> imgdiff: skip spurious gzip headers in image files

dragon kernel is compressed via lz4 for boot speed and bootloader
support reasons and recent prebuilts happen to include the gzip header
sequence which is causing imgdiff to fail.

Detect a spurious gzip header and treat the section as a normal section.

Bug: 26133184
Change-Id: I369d7d576fd7d2c579c0780fc5c669a5b6ea0d3d
(cherry picked from commit 0f2f6a746af517afca9e5e089a4a17be0a9766d6)
Signed-off-by: David Riley <davidriley@google.com>
/bootable/recovery/applypatch/imgdiff.cpp
a91c66d7c13e0143f63f0ea9c1c74ce39aecd79e 08-Sep-2015 Jeremy Compostella <jeremy.compostella@intel.com> imgdiff: fix file descriptor leak

mkstemp() allocates a file description that is never released. If
MakePatch() is called too many time, imgdiff reaches the Operating
System EMFILE (too many open files) limit.

Change-Id: Icbe1399f6f6d32cfa1830f879cacf7d75bbd9fc3
Signed-off-by: Jeremy Compostella <jeremy.compostella@intel.com>
Signed-off-by: Gaelle Nassiet <gaellex.nassiet@intel.com>
/bootable/recovery/applypatch/imgdiff.cpp
ba9a42aa7e10686de186636fe9fecbf8c4cc7c19 24-Jun-2015 Tao Bao <tbao@google.com> recovery: Switch applypatch/ and updater/ to cpp.

Mostly trivial changes to make cpp compiler happy.

Change-Id: I69bd1d96fcccf506007f6144faf37e11cfba1270
/bootable/recovery/applypatch/imgdiff.cpp