Allow payload_metadata to take raw pointers with size
This way, callers of payload_metadata don't have to store their data in
std::vector. This makes parsing a `mmap()`ed payload file possible.
While we don't need the ability to parse an mmap()ed payload on device,
it is really handy for parsing payload from host-side tooling. In which
case the entire payload will be available on disk anyway, and a
streaming parse will complicate code a lot.
Test: treehugger
Change-Id: Icfbd8e849093c8f389ea802864680ab214bdd721
diff --git a/payload_consumer/payload_metadata.cc b/payload_consumer/payload_metadata.cc
index 2cb73eb..f797723 100644
--- a/payload_consumer/payload_metadata.cc
+++ b/payload_consumer/payload_metadata.cc
@@ -50,12 +50,17 @@
MetadataParseResult PayloadMetadata::ParsePayloadHeader(
const brillo::Blob& payload, ErrorCode* error) {
+ return ParsePayloadHeader(payload.data(), payload.size(), error);
+}
+
+MetadataParseResult PayloadMetadata::ParsePayloadHeader(
+ const unsigned char* payload, size_t size, ErrorCode* error) {
// Ensure we have data to cover the major payload version.
- if (payload.size() < kDeltaManifestSizeOffset)
+ if (size < kDeltaManifestSizeOffset)
return MetadataParseResult::kInsufficientData;
// Validate the magic string.
- if (memcmp(payload.data(), kDeltaMagic, sizeof(kDeltaMagic)) != 0) {
+ if (memcmp(payload, kDeltaMagic, sizeof(kDeltaMagic)) != 0) {
LOG(ERROR) << "Bad payload format -- invalid delta magic: "
<< base::StringPrintf("%02x%02x%02x%02x",
payload[0],
@@ -74,7 +79,7 @@
uint64_t manifest_offset = GetManifestOffset();
// Check again with the manifest offset.
- if (payload.size() < manifest_offset)
+ if (size < manifest_offset)
return MetadataParseResult::kInsufficientData;
// Extract the payload version from the metadata.
@@ -136,8 +141,14 @@
bool PayloadMetadata::GetManifest(const brillo::Blob& payload,
DeltaArchiveManifest* out_manifest) const {
+ return GetManifest(payload.data(), payload.size(), out_manifest);
+}
+
+bool PayloadMetadata::GetManifest(const unsigned char* payload,
+ size_t size,
+ DeltaArchiveManifest* out_manifest) const {
uint64_t manifest_offset = GetManifestOffset();
- CHECK_GE(payload.size(), manifest_offset + manifest_size_);
+ CHECK_GE(size, manifest_offset + manifest_size_);
return out_manifest->ParseFromArray(&payload[manifest_offset],
manifest_size_);
}