summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKelvin Zhang <zhangkelvin@google.com>2023-06-15 09:49:14 -0700
committerKelvin Zhang <zhangkelvin@google.com>2023-06-15 10:58:41 -0700
commit023e6aef676d41ddeaa1fd07843b9a5f64434d4f (patch)
tree3c9ee91265f4ec3eaaa9c1587eba03dfdb5b8f2a
parent364dcb27baf5082784dc8d2c3aef3c290a726818 (diff)
downloadbsdiff-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.cc2
-rw-r--r--patch_writer.cc5
2 files changed, 2 insertions, 5 deletions
diff --git a/bsdiff.cc b/bsdiff.cc
index 8bb21b7..a1112d5 100644
--- a/bsdiff.cc
+++ b/bsdiff.cc
@@ -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) {