summaryrefslogtreecommitdiff
path: root/libs/androidfw/LoadedArsc.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'libs/androidfw/LoadedArsc.cpp')
-rw-r--r--libs/androidfw/LoadedArsc.cpp37
1 files changed, 37 insertions, 0 deletions
diff --git a/libs/androidfw/LoadedArsc.cpp b/libs/androidfw/LoadedArsc.cpp
index cb620cc475a9..d17c32817994 100644
--- a/libs/androidfw/LoadedArsc.cpp
+++ b/libs/androidfw/LoadedArsc.cpp
@@ -41,6 +41,7 @@ using android::base::StringPrintf;
namespace android {
+constexpr const static int kFrameworkPackageId = 0x01;
constexpr const static int kAppPackageId = 0x7f;
namespace {
@@ -675,6 +676,42 @@ std::unique_ptr<const LoadedPackage> LoadedPackage::Load(const Chunk& chunk,
}
} break;
+ case RES_TABLE_STAGED_ALIAS_TYPE: {
+ if (loaded_package->package_id_ != kFrameworkPackageId) {
+ LOG(WARNING) << "Alias chunk ignored for non-framework package '"
+ << loaded_package->package_name_ << "'";
+ break;
+ }
+
+ std::unordered_set<uint32_t> finalized_ids;
+ const auto lib_alias = child_chunk.header<ResTable_staged_alias_header>();
+ if (!lib_alias) {
+ return {};
+ }
+ const auto entry_begin = child_chunk.data_ptr().convert<ResTable_staged_alias_entry>();
+ const auto entry_end = entry_begin + dtohl(lib_alias->count);
+ for (auto entry_iter = entry_begin; entry_iter != entry_end; ++entry_iter) {
+ if (!entry_iter) {
+ return {};
+ }
+ auto finalized_id = dtohl(entry_iter->finalizedResId);
+ if (!finalized_ids.insert(finalized_id).second) {
+ LOG(ERROR) << StringPrintf("Repeated finalized resource id '%08x' in staged aliases.",
+ finalized_id);
+ return {};
+ }
+
+ auto staged_id = dtohl(entry_iter->stagedResId);
+ auto [_, success] = loaded_package->alias_id_map_.insert(std::make_pair(staged_id,
+ finalized_id));
+ if (!success) {
+ LOG(ERROR) << StringPrintf("Repeated staged resource id '%08x' in staged aliases.",
+ staged_id);
+ return {};
+ }
+ }
+ } break;
+
default:
LOG(WARNING) << StringPrintf("Unknown chunk type '%02x'.", chunk.type());
break;