Loading libs/androidfw/AssetManager2.cpp +5 −3 Original line number Diff line number Diff line Loading @@ -237,8 +237,9 @@ void AssetManager2::BuildDynamicRefTable(ApkAssetsList apk_assets) { // Add the package name -> build time ID mappings. for (const DynamicPackageEntry& entry : package->GetDynamicPackageMap()) { package_group->dynamic_ref_table->mEntries[entry.package_name] = static_cast<uint8_t>(entry.package_id); String16 package_name(entry.package_name.c_str(), entry.package_name.size()); package_group->dynamic_ref_table->mEntries.replaceValueFor( package_name, static_cast<uint8_t>(entry.package_id)); } if (auto apk_assets_path = apk_assets->GetPath()) { Loading @@ -252,8 +253,9 @@ void AssetManager2::BuildDynamicRefTable(ApkAssetsList apk_assets) { DynamicRefTable::AliasMap aliases; for (const auto& group : package_groups_) { const std::string& package_name = group.packages_[0].loaded_package_->GetPackageName(); const auto name_16 = String16(package_name.c_str(), package_name.size()); for (auto&& inner_group : package_groups_) { inner_group.dynamic_ref_table->addMapping(package_name, inner_group.dynamic_ref_table->addMapping(name_16, group.dynamic_ref_table->mAssignedPackageId); } Loading libs/androidfw/ResourceTypes.cpp +25 −21 Original line number Diff line number Diff line Loading @@ -39,10 +39,8 @@ #include <androidfw/ByteBucketArray.h> #include <androidfw/ResourceTypes.h> #include <androidfw/TypeWrappers.h> #include <androidfw/Util.h> #include <cutils/atomic.h> #include <utils/ByteOrder.h> #include <utils/KeyedVector.h> #include <utils/Log.h> #include <utils/String16.h> #include <utils/String8.h> Loading Loading @@ -6962,7 +6960,7 @@ status_t ResTable::parsePackage(const ResTable_package* const pkg, size_t N = mPackageGroups.size(); for (size_t i = 0; i < N; i++) { mPackageGroups[i]->dynamicRefTable.addMapping( std::string_view(String8(group->name)), static_cast<uint8_t>(group->id)); group->name, static_cast<uint8_t>(group->id)); } } else { group = mPackageGroups.itemAt(idx - 1); Loading Loading @@ -7160,8 +7158,7 @@ status_t ResTable::parsePackage(const ResTable_package* const pkg, // Fill in the reference table with the entries we already know about. size_t N = mPackageGroups.size(); for (size_t i = 0; i < N; i++) { group->dynamicRefTable.addMapping( std::string_view(String8(mPackageGroups[i]->name)), mPackageGroups[i]->id); group->dynamicRefTable.addMapping(mPackageGroups[i]->name, mPackageGroups[i]->id); } } else { ALOGW("Found multiple library tables, ignoring..."); Loading Loading @@ -7208,20 +7205,19 @@ status_t DynamicRefTable::load(const ResTable_lib_header* const header) const ResTable_lib_entry* entry = (const ResTable_lib_entry*)(((uint8_t*) header) + dtohl(header->header.headerSize)); std::string package_name; for (uint32_t entryIndex = 0; entryIndex < entryCount; entryIndex++) { uint32_t packageId = dtohl(entry->packageId); util::ReadUtf16StringFromDevice(entry->packageName, std::size(entry->packageName), &package_name); char16_t tmpName[sizeof(entry->packageName) / sizeof(char16_t)]; strcpy16_dtoh(tmpName, entry->packageName, sizeof(entry->packageName) / sizeof(char16_t)); if (kDebugLibNoisy) { ALOGV("Found lib entry %s with id %d\n", package_name.c_str(), ALOGV("Found lib entry %s with id %d\n", String8(tmpName).c_str(), dtohl(entry->packageId)); } if (packageId >= 256) { ALOGE("Bad package id 0x%08x", packageId); return UNKNOWN_ERROR; } mEntries[std::move(package_name)] = (uint8_t) packageId; mEntries.replaceValueFor(String16(tmpName), (uint8_t) packageId); entry = entry + 1; } return NO_ERROR; Loading @@ -7232,12 +7228,17 @@ status_t DynamicRefTable::addMappings(const DynamicRefTable& other) { return UNKNOWN_ERROR; } for (auto [name, id] : other.mEntries) { auto [it, inserted] = mEntries.emplace(name, id); if (!inserted && id != it->second) { const size_t entryCount = other.mEntries.size(); for (size_t i = 0; i < entryCount; i++) { ssize_t index = mEntries.indexOfKey(other.mEntries.keyAt(i)); if (index < 0) { mEntries.add(String16(other.mEntries.keyAt(i)), other.mEntries[i]); } else { if (other.mEntries[i] != mEntries[index]) { return UNKNOWN_ERROR; } } } // Merge the lookup table. No entry can conflict // (value of 0 means not set). Loading @@ -7253,12 +7254,13 @@ status_t DynamicRefTable::addMappings(const DynamicRefTable& other) { return NO_ERROR; } status_t DynamicRefTable::addMapping(std::string_view packageName, uint8_t packageId) { auto it = mEntries.find(packageName); if (it == mEntries.end()) { status_t DynamicRefTable::addMapping(const String16& packageName, uint8_t packageId) { ssize_t index = mEntries.indexOfKey(packageName); if (index < 0) { return UNKNOWN_ERROR; } mLookupTable[it->second] = packageId; mLookupTable[mEntries.valueAt(index)] = packageId; return NO_ERROR; } Loading Loading @@ -7740,12 +7742,14 @@ void ResTable::print(bool inclValues) const (int)pgIndex, pg->id, (int)pg->packages.size(), String8(pg->name).c_str()); const auto& refEntries = pg->dynamicRefTable.entries(); const KeyedVector<String16, uint8_t>& refEntries = pg->dynamicRefTable.entries(); const size_t refEntryCount = refEntries.size(); if (refEntryCount > 0) { printf(" DynamicRefTable entryCount=%d:\n", (int) refEntryCount); for (auto [refName, refId] : refEntries) { printf(" 0x%02x -> %s\n", refId, refName.c_str()); for (size_t refIndex = 0; refIndex < refEntryCount; refIndex++) { printf(" 0x%02x -> %s\n", refEntries.valueAt(refIndex), String8(refEntries.keyAt(refIndex)).c_str()); } printf("\n"); } Loading libs/androidfw/fuzz/resxmlparser_fuzzer/resxmlparser_fuzzer.cpp +4 −1 Original line number Diff line number Diff line Loading @@ -37,8 +37,11 @@ static void populateDynamicRefTableWithFuzzedData( packageName.push_back(ch); } // Convert std::string to String16 for compatibility android::String16 androidPackageName(packageName.c_str(), packageName.length()); // Add the mapping to the table table.addMapping(packageName, packageId); table.addMapping(androidPackageName, packageId); } } Loading libs/androidfw/include/androidfw/ResourceTypes.h +4 −4 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ #include <androidfw/StringPiece.h> #include <utils/ByteOrder.h> #include <utils/Errors.h> #include <utils/KeyedVector.h> #include <utils/String16.h> #include <utils/Vector.h> #include <utils/threads.h> Loading Loading @@ -1962,7 +1963,7 @@ public: // Creates a mapping from build-time package ID to run-time package ID for // the given package. status_t addMapping(std::string_view packageName, uint8_t packageId); status_t addMapping(const String16& packageName, uint8_t packageId); void addMapping(uint8_t buildPackageId, uint8_t runtimePackageId); Loading @@ -1979,8 +1980,7 @@ public: virtual status_t lookupResourceId(uint32_t* resId) const; status_t lookupResourceValue(Res_value* value) const; using Entries = std::map<std::string, uint8_t, std::less<>>; const Entries& entries() const { inline const KeyedVector<String16, uint8_t>& entries() const { return mEntries; } Loading @@ -1988,7 +1988,7 @@ public: uint8_t mLookupTable[256]; uint8_t mAssignedPackageId; bool mAppAsLib; Entries mEntries; KeyedVector<String16, uint8_t> mEntries; AliasMap mAliasId; }; Loading tools/aapt2/format/binary/BinaryResourceParser.cpp +5 −3 Original line number Diff line number Diff line Loading @@ -451,9 +451,11 @@ bool BinaryResourceParser::ParseLibrary(const ResChunk_header* chunk) { return false; } const auto& entries = dynamic_ref_table.entries(); for (auto [name, id] : entries) { table_->included_packages_[id] = name; const KeyedVector<String16, uint8_t>& entries = dynamic_ref_table.entries(); const size_t count = entries.size(); for (size_t i = 0; i < count; i++) { table_->included_packages_[entries.valueAt(i)] = android::util::Utf16ToUtf8(StringPiece16(entries.keyAt(i).c_str())); } return true; } Loading Loading
libs/androidfw/AssetManager2.cpp +5 −3 Original line number Diff line number Diff line Loading @@ -237,8 +237,9 @@ void AssetManager2::BuildDynamicRefTable(ApkAssetsList apk_assets) { // Add the package name -> build time ID mappings. for (const DynamicPackageEntry& entry : package->GetDynamicPackageMap()) { package_group->dynamic_ref_table->mEntries[entry.package_name] = static_cast<uint8_t>(entry.package_id); String16 package_name(entry.package_name.c_str(), entry.package_name.size()); package_group->dynamic_ref_table->mEntries.replaceValueFor( package_name, static_cast<uint8_t>(entry.package_id)); } if (auto apk_assets_path = apk_assets->GetPath()) { Loading @@ -252,8 +253,9 @@ void AssetManager2::BuildDynamicRefTable(ApkAssetsList apk_assets) { DynamicRefTable::AliasMap aliases; for (const auto& group : package_groups_) { const std::string& package_name = group.packages_[0].loaded_package_->GetPackageName(); const auto name_16 = String16(package_name.c_str(), package_name.size()); for (auto&& inner_group : package_groups_) { inner_group.dynamic_ref_table->addMapping(package_name, inner_group.dynamic_ref_table->addMapping(name_16, group.dynamic_ref_table->mAssignedPackageId); } Loading
libs/androidfw/ResourceTypes.cpp +25 −21 Original line number Diff line number Diff line Loading @@ -39,10 +39,8 @@ #include <androidfw/ByteBucketArray.h> #include <androidfw/ResourceTypes.h> #include <androidfw/TypeWrappers.h> #include <androidfw/Util.h> #include <cutils/atomic.h> #include <utils/ByteOrder.h> #include <utils/KeyedVector.h> #include <utils/Log.h> #include <utils/String16.h> #include <utils/String8.h> Loading Loading @@ -6962,7 +6960,7 @@ status_t ResTable::parsePackage(const ResTable_package* const pkg, size_t N = mPackageGroups.size(); for (size_t i = 0; i < N; i++) { mPackageGroups[i]->dynamicRefTable.addMapping( std::string_view(String8(group->name)), static_cast<uint8_t>(group->id)); group->name, static_cast<uint8_t>(group->id)); } } else { group = mPackageGroups.itemAt(idx - 1); Loading Loading @@ -7160,8 +7158,7 @@ status_t ResTable::parsePackage(const ResTable_package* const pkg, // Fill in the reference table with the entries we already know about. size_t N = mPackageGroups.size(); for (size_t i = 0; i < N; i++) { group->dynamicRefTable.addMapping( std::string_view(String8(mPackageGroups[i]->name)), mPackageGroups[i]->id); group->dynamicRefTable.addMapping(mPackageGroups[i]->name, mPackageGroups[i]->id); } } else { ALOGW("Found multiple library tables, ignoring..."); Loading Loading @@ -7208,20 +7205,19 @@ status_t DynamicRefTable::load(const ResTable_lib_header* const header) const ResTable_lib_entry* entry = (const ResTable_lib_entry*)(((uint8_t*) header) + dtohl(header->header.headerSize)); std::string package_name; for (uint32_t entryIndex = 0; entryIndex < entryCount; entryIndex++) { uint32_t packageId = dtohl(entry->packageId); util::ReadUtf16StringFromDevice(entry->packageName, std::size(entry->packageName), &package_name); char16_t tmpName[sizeof(entry->packageName) / sizeof(char16_t)]; strcpy16_dtoh(tmpName, entry->packageName, sizeof(entry->packageName) / sizeof(char16_t)); if (kDebugLibNoisy) { ALOGV("Found lib entry %s with id %d\n", package_name.c_str(), ALOGV("Found lib entry %s with id %d\n", String8(tmpName).c_str(), dtohl(entry->packageId)); } if (packageId >= 256) { ALOGE("Bad package id 0x%08x", packageId); return UNKNOWN_ERROR; } mEntries[std::move(package_name)] = (uint8_t) packageId; mEntries.replaceValueFor(String16(tmpName), (uint8_t) packageId); entry = entry + 1; } return NO_ERROR; Loading @@ -7232,12 +7228,17 @@ status_t DynamicRefTable::addMappings(const DynamicRefTable& other) { return UNKNOWN_ERROR; } for (auto [name, id] : other.mEntries) { auto [it, inserted] = mEntries.emplace(name, id); if (!inserted && id != it->second) { const size_t entryCount = other.mEntries.size(); for (size_t i = 0; i < entryCount; i++) { ssize_t index = mEntries.indexOfKey(other.mEntries.keyAt(i)); if (index < 0) { mEntries.add(String16(other.mEntries.keyAt(i)), other.mEntries[i]); } else { if (other.mEntries[i] != mEntries[index]) { return UNKNOWN_ERROR; } } } // Merge the lookup table. No entry can conflict // (value of 0 means not set). Loading @@ -7253,12 +7254,13 @@ status_t DynamicRefTable::addMappings(const DynamicRefTable& other) { return NO_ERROR; } status_t DynamicRefTable::addMapping(std::string_view packageName, uint8_t packageId) { auto it = mEntries.find(packageName); if (it == mEntries.end()) { status_t DynamicRefTable::addMapping(const String16& packageName, uint8_t packageId) { ssize_t index = mEntries.indexOfKey(packageName); if (index < 0) { return UNKNOWN_ERROR; } mLookupTable[it->second] = packageId; mLookupTable[mEntries.valueAt(index)] = packageId; return NO_ERROR; } Loading Loading @@ -7740,12 +7742,14 @@ void ResTable::print(bool inclValues) const (int)pgIndex, pg->id, (int)pg->packages.size(), String8(pg->name).c_str()); const auto& refEntries = pg->dynamicRefTable.entries(); const KeyedVector<String16, uint8_t>& refEntries = pg->dynamicRefTable.entries(); const size_t refEntryCount = refEntries.size(); if (refEntryCount > 0) { printf(" DynamicRefTable entryCount=%d:\n", (int) refEntryCount); for (auto [refName, refId] : refEntries) { printf(" 0x%02x -> %s\n", refId, refName.c_str()); for (size_t refIndex = 0; refIndex < refEntryCount; refIndex++) { printf(" 0x%02x -> %s\n", refEntries.valueAt(refIndex), String8(refEntries.keyAt(refIndex)).c_str()); } printf("\n"); } Loading
libs/androidfw/fuzz/resxmlparser_fuzzer/resxmlparser_fuzzer.cpp +4 −1 Original line number Diff line number Diff line Loading @@ -37,8 +37,11 @@ static void populateDynamicRefTableWithFuzzedData( packageName.push_back(ch); } // Convert std::string to String16 for compatibility android::String16 androidPackageName(packageName.c_str(), packageName.length()); // Add the mapping to the table table.addMapping(packageName, packageId); table.addMapping(androidPackageName, packageId); } } Loading
libs/androidfw/include/androidfw/ResourceTypes.h +4 −4 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ #include <androidfw/StringPiece.h> #include <utils/ByteOrder.h> #include <utils/Errors.h> #include <utils/KeyedVector.h> #include <utils/String16.h> #include <utils/Vector.h> #include <utils/threads.h> Loading Loading @@ -1962,7 +1963,7 @@ public: // Creates a mapping from build-time package ID to run-time package ID for // the given package. status_t addMapping(std::string_view packageName, uint8_t packageId); status_t addMapping(const String16& packageName, uint8_t packageId); void addMapping(uint8_t buildPackageId, uint8_t runtimePackageId); Loading @@ -1979,8 +1980,7 @@ public: virtual status_t lookupResourceId(uint32_t* resId) const; status_t lookupResourceValue(Res_value* value) const; using Entries = std::map<std::string, uint8_t, std::less<>>; const Entries& entries() const { inline const KeyedVector<String16, uint8_t>& entries() const { return mEntries; } Loading @@ -1988,7 +1988,7 @@ public: uint8_t mLookupTable[256]; uint8_t mAssignedPackageId; bool mAppAsLib; Entries mEntries; KeyedVector<String16, uint8_t> mEntries; AliasMap mAliasId; }; Loading
tools/aapt2/format/binary/BinaryResourceParser.cpp +5 −3 Original line number Diff line number Diff line Loading @@ -451,9 +451,11 @@ bool BinaryResourceParser::ParseLibrary(const ResChunk_header* chunk) { return false; } const auto& entries = dynamic_ref_table.entries(); for (auto [name, id] : entries) { table_->included_packages_[id] = name; const KeyedVector<String16, uint8_t>& entries = dynamic_ref_table.entries(); const size_t count = entries.size(); for (size_t i = 0; i < count; i++) { table_->included_packages_[entries.valueAt(i)] = android::util::Utf16ToUtf8(StringPiece16(entries.keyAt(i).c_str())); } return true; } Loading