Fix puffin failure on duplicating deflates
Test: th
Bug: 322549011
Change-Id: I905ffbf5b3ff10f609be52a6acd8c59f16de5608
diff --git a/payload_generator/deflate_utils.cc b/payload_generator/deflate_utils.cc
index cc2e4d6..d196799 100644
--- a/payload_generator/deflate_utils.cc
+++ b/payload_generator/deflate_utils.cc
@@ -27,6 +27,7 @@
#include "update_engine/common/utils.h"
#include "update_engine/payload_generator/delta_diff_generator.h"
#include "update_engine/payload_generator/extent_ranges.h"
+#include "update_engine/payload_generator/extent_utils.h"
#include "update_engine/payload_generator/squashfs_filesystem.h"
#include "update_engine/update_metadata.pb.h"
@@ -39,6 +40,12 @@
namespace deflate_utils {
namespace {
+constexpr std::ostream& operator<<(std::ostream& out,
+ const puffin::BitExtent& ext) {
+ out << "BitExtent(" << ext.offset << "," << ext.length << ")";
+ return out;
+}
+
// The minimum size for a squashfs image to be processed.
const uint64_t kMinimumSquashfsImageSize = 1 * 1024 * 1024; // bytes
@@ -254,7 +261,8 @@
// All given |in_deflates| items should've been inside one of the extents in
// |extents|.
- TEST_AND_RETURN_FALSE(in_deflates.size() == out_deflates->size());
+ TEST_EQ(in_deflates.size(), out_deflates->size());
+ Dedup(out_deflates);
// Make sure all outgoing deflates are ordered and non-overlapping.
auto result = std::adjacent_find(out_deflates->begin(),
@@ -262,7 +270,11 @@
[](const BitExtent& a, const BitExtent& b) {
return (a.offset + a.length) > b.offset;
});
- TEST_AND_RETURN_FALSE(result == out_deflates->end());
+ if (result != out_deflates->end()) {
+ LOG(ERROR) << "out_deflate is overlapped " << (*result) << ", "
+ << *(++result);
+ return false;
+ }
return true;
}