diff options
author | Kelvin Zhang <zhangkelvin@google.com> | 2023-06-15 09:49:14 -0700 |
---|---|---|
committer | Kelvin Zhang <zhangkelvin@google.com> | 2023-06-15 10:58:41 -0700 |
commit | 023e6aef676d41ddeaa1fd07843b9a5f64434d4f (patch) | |
tree | 3c9ee91265f4ec3eaaa9c1587eba03dfdb5b8f2a | |
parent | 364dcb27baf5082784dc8d2c3aef3c290a726818 (diff) | |
download | bsdiff-023e6aef676d41ddeaa1fd07843b9a5f64434d4f.tar.gz |
Exit loop earlier for bsdiff's pathological case
Looking at bsdiff's comment, original author want to generate a diff
patch only if diff is no smaller than 8 bytes. Actual code only only
permits the diff to be generated if diff > 8 bytes.
Partners reported a pair of problematic files where BSDIFF takes more
than 10 hours(input file is only ~80MB). After applying this patch,
bsdiff takes ~1 minute.
To make sure this patch does not harm patch size for non-pathological
cases, I tested multiple pixel OTAs. Total OTA size increased by just
0.002% . Basically negligible.
Test: Multiple pixle OTAs
Bug: 285271992
Change-Id: I2a9b52939f8d17ea48dc2908942b2cc21cbe4e09
-rw-r--r-- | bsdiff.cc | 2 | ||||
-rw-r--r-- | patch_writer.cc | 5 |
2 files changed, 2 insertions, 5 deletions
@@ -119,7 +119,7 @@ int bsdiff(const uint8_t* old_buf, size_t oldsize, const uint8_t* new_buf, oldscore++; if(((len==oldscore) && (len!=0)) || - (len>oldscore+8 && len>=min_length)) break; + (len>=oldscore+8 && len>=min_length)) break; if((scan+lastoffset<oldsize) && (old_buf[scan+lastoffset] == new_buf[scan])) diff --git a/patch_writer.cc b/patch_writer.cc index b7d9b08..83bc531 100644 --- a/patch_writer.cc +++ b/patch_writer.cc @@ -13,10 +13,6 @@ #include "bsdiff/control_entry.h" #include "bsdiff/logging.h" -namespace { - - -} // namespace namespace bsdiff { @@ -43,6 +39,7 @@ bool BsdiffPatchWriter::InitializeCompressorList( LOG(ERROR) << "Patch writer expects at least one compressor."; return false; } + compressor_list->clear(); for (const auto& type : types_) { switch (type) { |