diff options
-rw-r--r-- | dynamic_partition_control_android.cc | 7 | ||||
-rw-r--r-- | payload_consumer/payload_metadata.cc | 14 | ||||
-rwxr-xr-x | scripts/update_device.py | 35 |
3 files changed, 50 insertions, 6 deletions
diff --git a/dynamic_partition_control_android.cc b/dynamic_partition_control_android.cc index ecd6252d..708380a8 100644 --- a/dynamic_partition_control_android.cc +++ b/dynamic_partition_control_android.cc @@ -795,7 +795,12 @@ bool DynamicPartitionControlAndroid::UpdatePartitionMetadata( std::string expr; uint64_t allocatable_space = builder->AllocatableSpace(); - if (!GetDynamicPartitionsFeatureFlag().IsRetrofit()) { + // On device retrofitting dynamic partitions, allocatable_space = super. + // On device launching dynamic partitions w/o VAB, + // allocatable_space = super / 2. + // On device launching dynamic partitions with VAB, allocatable_space = super. + if (!GetDynamicPartitionsFeatureFlag().IsRetrofit() && + !GetVirtualAbFeatureFlag().IsEnabled()) { allocatable_space /= 2; expr = "half of "; } diff --git a/payload_consumer/payload_metadata.cc b/payload_consumer/payload_metadata.cc index 09526460..19052b99 100644 --- a/payload_consumer/payload_metadata.cc +++ b/payload_consumer/payload_metadata.cc @@ -18,6 +18,7 @@ #include <endian.h> +#include <base/strings/stringprintf.h> #include <brillo/data_encoding.h> #include "update_engine/common/constants.h" @@ -71,7 +72,18 @@ MetadataParseResult PayloadMetadata::ParsePayloadHeader( // Validate the magic string. if (memcmp(payload.data(), kDeltaMagic, sizeof(kDeltaMagic)) != 0) { - LOG(ERROR) << "Bad payload format -- invalid delta magic."; + LOG(ERROR) << "Bad payload format -- invalid delta magic: " + << base::StringPrintf("%02x%02x%02x%02x", + payload[0], + payload[1], + payload[2], + payload[3]) + << " Expected: " + << base::StringPrintf("%02x%02x%02x%02x", + kDeltaMagic[0], + kDeltaMagic[1], + kDeltaMagic[2], + kDeltaMagic[3]); *error = ErrorCode::kDownloadInvalidMetadataMagicString; return MetadataParseResult::kError; } diff --git a/scripts/update_device.py b/scripts/update_device.py index 49f766da..371a89a8 100755 --- a/scripts/update_device.py +++ b/scripts/update_device.py @@ -19,12 +19,14 @@ import argparse import BaseHTTPServer +import binascii import hashlib import logging import os import socket import subprocess import sys +import struct import threading import xml.etree.ElementTree import zipfile @@ -85,6 +87,7 @@ class AndroidOTAPackage(object): OTA_PAYLOAD_PROPERTIES_TXT = 'payload_properties.txt' SECONDARY_OTA_PAYLOAD_BIN = 'secondary/payload.bin' SECONDARY_OTA_PAYLOAD_PROPERTIES_TXT = 'secondary/payload_properties.txt' + PAYLOAD_MAGIC_HEADER = b'CrAU' def __init__(self, otafilename, secondary_payload=False): self.otafilename = otafilename @@ -93,10 +96,34 @@ class AndroidOTAPackage(object): payload_entry = (self.SECONDARY_OTA_PAYLOAD_BIN if secondary_payload else self.OTA_PAYLOAD_BIN) payload_info = otazip.getinfo(payload_entry) - self.offset = payload_info.header_offset - self.offset += zipfile.sizeFileHeader - self.offset += len(payload_info.extra) + len(payload_info.filename) - self.size = payload_info.file_size + + if payload_info.compress_type != 0: + logging.error( + "Expected layload to be uncompressed, got compression method %d", + payload_info.compress_type) + # Don't use len(payload_info.extra). Because that returns size of extra + # fields in central directory. We need to look at local file directory, + # as these two might have different sizes. + with open(otafilename, "rb") as fp: + fp.seek(payload_info.header_offset) + data = fp.read(zipfile.sizeFileHeader) + fheader = struct.unpack(zipfile.structFileHeader, data) + # Last two fields of local file header are filename length and + # extra length + filename_len = fheader[-2] + extra_len = fheader[-1] + self.offset = payload_info.header_offset + self.offset += zipfile.sizeFileHeader + self.offset += filename_len + extra_len + self.size = payload_info.file_size + fp.seek(self.offset) + payload_header = fp.read(4) + if payload_header != self.PAYLOAD_MAGIC_HEADER: + logging.warning( + "Invalid header, expeted %s, got %s." + "Either the offset is not correct, or payload is corrupted", + binascii.hexlify(self.PAYLOAD_MAGIC_HEADER), + payload_header) property_entry = (self.SECONDARY_OTA_PAYLOAD_PROPERTIES_TXT if secondary_payload else self.OTA_PAYLOAD_PROPERTIES_TXT) |