liblp: Allow GSI metadata to bypass slot suffixing checks.

Bug: 121210348
Test: manual test
Change-Id: I40634c72b0255197a5c16e23553f4cf54bc32579
This commit is contained in:
David Anderson 2019-01-03 18:13:27 -08:00
parent 189727089e
commit 126e481972
2 changed files with 10 additions and 2 deletions

View file

@ -212,7 +212,7 @@ void MetadataBuilder::OverrideABForTesting(bool ab_device) {
sABOverrideValue = ab_device;
}
MetadataBuilder::MetadataBuilder() : auto_slot_suffixing_(false) {
MetadataBuilder::MetadataBuilder() : auto_slot_suffixing_(false), ignore_slot_suffixing_(false) {
memset(&geometry_, 0, sizeof(geometry_));
geometry_.magic = LP_METADATA_GEOMETRY_MAGIC;
geometry_.struct_size = sizeof(geometry_);
@ -436,7 +436,7 @@ Partition* MetadataBuilder::AddPartition(const std::string& name, const std::str
LERROR << "Could not find partition group: " << group_name;
return nullptr;
}
if (IsABDevice() && !auto_slot_suffixing_ && name != "scratch" &&
if (IsABDevice() && !auto_slot_suffixing_ && name != "scratch" && !ignore_slot_suffixing_ &&
GetPartitionSlotSuffix(name).empty()) {
LERROR << "Unsuffixed partition not allowed on A/B device: " << name;
return nullptr;
@ -972,6 +972,10 @@ void MetadataBuilder::SetAutoSlotSuffixing() {
auto_slot_suffixing_ = true;
}
void MetadataBuilder::IgnoreSlotSuffixing() {
ignore_slot_suffixing_ = true;
}
bool MetadataBuilder::IsABDevice() const {
if (sABOverrideSet) {
return sABOverrideValue;

View file

@ -248,6 +248,9 @@ class MetadataBuilder {
// Set the LP_METADATA_AUTO_SLOT_SUFFIXING flag.
void SetAutoSlotSuffixing();
// If set, checks for slot suffixes will be ignored internally.
void IgnoreSlotSuffixing();
bool GetBlockDeviceInfo(const std::string& partition_name, BlockDeviceInfo* info) const;
bool UpdateBlockDeviceInfo(const std::string& partition_name, const BlockDeviceInfo& info);
@ -310,6 +313,7 @@ class MetadataBuilder {
std::vector<std::unique_ptr<PartitionGroup>> groups_;
std::vector<LpMetadataBlockDevice> block_devices_;
bool auto_slot_suffixing_;
bool ignore_slot_suffixing_;
};
// Read BlockDeviceInfo for a given block device. This always returns false