diff options
author | Kelvin Zhang <zhangkelvin@google.com> | 2021-03-08 16:10:25 -0500 |
---|---|---|
committer | Treehugger Robot <treehugger-gerrit@google.com> | 2021-03-16 22:56:12 +0000 |
commit | ebd115e8bd045dfd05889e3574d5a02e7b53b2be (patch) | |
tree | dc7bb569d81005c0c12b1903daf78b2ea73221a3 /aosp/dynamic_partition_control_android.cc | |
parent | 0c37f621642817314cd40b3aaa444137114af198 (diff) |
Pass in source slot to ctor of dynamic control
When DynamicPartitionControlAndroid is constructed, it initializes both
source and target slot to -1. These values get updated during
PreparePartitionsForUpdate call. And we only
PreparePartitionsForUpdate() when applying an OTA or applocating space
for an OTA(not when verifying OTA metadata). Which means if
VerifyPayloadApplicable() is called before any call two other APIs, we
could be using an "Uninitialiazed" dynamic partition control.
To mitigate this problem, we pass in source_slot at ctor of
DynamicPartitionControl, also make IsDynamicPartition() api take in a
slot number to avoid reading uninitialized member fields.
Bug: 181643302
Test: apply an OTA, abort, restart update_engine, verify a payload
Change-Id: I9a8a0fe8a9aca48e91241e15bdec33a1c1228553
Diffstat (limited to 'aosp/dynamic_partition_control_android.cc')
-rw-r--r-- | aosp/dynamic_partition_control_android.cc | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/aosp/dynamic_partition_control_android.cc b/aosp/dynamic_partition_control_android.cc index aba6deb4..4220445c 100644 --- a/aosp/dynamic_partition_control_android.cc +++ b/aosp/dynamic_partition_control_android.cc @@ -116,12 +116,14 @@ static FeatureFlag GetFeatureFlag(const char* enable_prop, return FeatureFlag(FeatureFlag::Value::NONE); } -DynamicPartitionControlAndroid::DynamicPartitionControlAndroid() +DynamicPartitionControlAndroid::DynamicPartitionControlAndroid( + uint32_t source_slot) : dynamic_partitions_( GetFeatureFlag(kUseDynamicPartitions, kRetrfoitDynamicPartitions)), virtual_ab_(GetFeatureFlag(kVirtualAbEnabled, kVirtualAbRetrofit)), virtual_ab_compression_(GetFeatureFlag(kVirtualAbCompressionEnabled, - kVirtualAbCompressionRetrofit)) { + kVirtualAbCompressionRetrofit)), + source_slot_(source_slot) { if (GetVirtualAbFeatureFlag().IsEnabled()) { snapshot_ = SnapshotManager::New(); } else { @@ -1019,8 +1021,8 @@ DynamicPartitionControlAndroid::GetPartitionDevice( // target slot. const auto& partition_name_suffix = partition_name + SlotSuffixForSlotNumber(slot); - if (UpdateUsesSnapshotCompression() && IsDynamicPartition(partition_name) && - slot != current_slot) { + if (UpdateUsesSnapshotCompression() && slot != current_slot && + IsDynamicPartition(partition_name, slot)) { return { {.mountable_device_path = base::FilePath{std::string{VABC_DEVICE_DIR}} .Append(partition_name_suffix) @@ -1211,6 +1213,14 @@ bool DynamicPartitionControlAndroid::ListDynamicPartitionsForSlot( uint32_t slot, uint32_t current_slot, std::vector<std::string>* partitions) { + CHECK(slot == source_slot_ || target_slot_ != UINT32_MAX) + << " source slot: " << source_slot_ << " target slot: " << target_slot_ + << " slot: " << slot + << " attempting to query dynamic partition metadata for target slot " + "before PreparePartitionForUpdate() is called. The " + "metadata in target slot isn't valid until " + "PreparePartitionForUpdate() is called, contining execution would " + "likely cause problems."; bool slot_enables_dynamic_partitions = GetDynamicPartitionsFeatureFlag().IsEnabled(); // Check if the target slot has dynamic partitions, this may happen when @@ -1347,16 +1357,22 @@ bool DynamicPartitionControlAndroid::MapAllPartitions() { } bool DynamicPartitionControlAndroid::IsDynamicPartition( - const std::string& partition_name) { - if (dynamic_partition_list_.empty() && + const std::string& partition_name, uint32_t slot) { + if (slot >= dynamic_partition_list_.size()) { + LOG(ERROR) << "Seeing unexpected slot # " << slot << " currently assuming " + << dynamic_partition_list_.size() << " slots"; + return false; + } + auto& dynamic_partition_list = dynamic_partition_list_[slot]; + if (dynamic_partition_list.empty() && GetDynamicPartitionsFeatureFlag().IsEnabled()) { // Use the DAP config of the target slot. CHECK(ListDynamicPartitionsForSlot( - target_slot_, source_slot_, &dynamic_partition_list_)); + slot, source_slot_, &dynamic_partition_list)); } - return std::find(dynamic_partition_list_.begin(), - dynamic_partition_list_.end(), - partition_name) != dynamic_partition_list_.end(); + return std::find(dynamic_partition_list.begin(), + dynamic_partition_list.end(), + partition_name) != dynamic_partition_list.end(); } bool DynamicPartitionControlAndroid::UpdateUsesSnapshotCompression() { |