diff options
Diffstat (limited to 'libs/androidfw/LoadedArsc.cpp')
| -rw-r--r-- | libs/androidfw/LoadedArsc.cpp | 35 | 
1 files changed, 21 insertions, 14 deletions
diff --git a/libs/androidfw/LoadedArsc.cpp b/libs/androidfw/LoadedArsc.cpp index 386f718208b3..c0fdfe25da21 100644 --- a/libs/androidfw/LoadedArsc.cpp +++ b/libs/androidfw/LoadedArsc.cpp @@ -645,16 +645,16 @@ std::unique_ptr<const LoadedPackage> LoadedPackage::Load(const Chunk& chunk,          }          std::string name; -        util::ReadUtf16StringFromDevice(overlayable->name, arraysize(overlayable->name), &name); +        util::ReadUtf16StringFromDevice(overlayable->name, std::size(overlayable->name), &name);          std::string actor; -        util::ReadUtf16StringFromDevice(overlayable->actor, arraysize(overlayable->actor), &actor); - -        if (loaded_package->overlayable_map_.find(name) != -            loaded_package->overlayable_map_.end()) { -          LOG(ERROR) << "Multiple <overlayable> blocks with the same name '" << name << "'."; +        util::ReadUtf16StringFromDevice(overlayable->actor, std::size(overlayable->actor), &actor); +        auto [name_to_actor_it, inserted] = +            loaded_package->overlayable_map_.emplace(std::move(name), std::move(actor)); +        if (!inserted) { +          LOG(ERROR) << "Multiple <overlayable> blocks with the same name '" +                     << name_to_actor_it->first << "'.";            return {};          } -        loaded_package->overlayable_map_.emplace(name, actor);          // Iterate over the overlayable policy chunks contained within the overlayable chunk data          ChunkIterator overlayable_iter(child_chunk.data_ptr(), child_chunk.data_size()); @@ -669,7 +669,6 @@ std::unique_ptr<const LoadedPackage> LoadedPackage::Load(const Chunk& chunk,                  LOG(ERROR) << "RES_TABLE_OVERLAYABLE_POLICY_TYPE too small.";                  return {};                } -                if ((overlayable_child_chunk.data_size() / sizeof(ResTable_ref))                    < dtohl(policy_header->entry_count)) {                  LOG(ERROR) <<  "RES_TABLE_OVERLAYABLE_POLICY_TYPE too small to hold entries."; @@ -691,8 +690,8 @@ std::unique_ptr<const LoadedPackage> LoadedPackage::Load(const Chunk& chunk,                // Add the pairing of overlayable properties and resource ids to the package                OverlayableInfo overlayable_info { -                .name = name, -                .actor = actor, +                .name = name_to_actor_it->first, +                .actor = name_to_actor_it->second,                  .policy_flags = policy_header->policy_flags                };                loaded_package->overlayable_infos_.emplace_back(std::move(overlayable_info), std::move(ids)); @@ -736,6 +735,7 @@ std::unique_ptr<const LoadedPackage> LoadedPackage::Load(const Chunk& chunk,          const auto entry_end = entry_begin + dtohl(lib_alias->count);          std::unordered_set<uint32_t> finalized_ids;          finalized_ids.reserve(entry_end - entry_begin); +        loaded_package->alias_id_map_.reserve(entry_end - entry_begin);          for (auto entry_iter = entry_begin; entry_iter != entry_end; ++entry_iter) {            if (!entry_iter) {              LOG(ERROR) << "NULL ResTable_staged_alias_entry record??"; @@ -749,13 +749,20 @@ std::unique_ptr<const LoadedPackage> LoadedPackage::Load(const Chunk& chunk,            }            auto staged_id = dtohl(entry_iter->stagedResId); -          auto [_, success] = loaded_package->alias_id_map_.emplace(staged_id, finalized_id); -          if (!success) { +          loaded_package->alias_id_map_.emplace_back(staged_id, finalized_id); +        } + +        std::sort(loaded_package->alias_id_map_.begin(), loaded_package->alias_id_map_.end(), +            [](auto&& l, auto&& r) { return l.first < r.first; }); +        const auto duplicate_it = +            std::adjacent_find(loaded_package->alias_id_map_.begin(), +                               loaded_package->alias_id_map_.end(), +                               [](auto&& l, auto&& r) { return l.first == r.first; }); +          if (duplicate_it != loaded_package->alias_id_map_.end()) {              LOG(ERROR) << StringPrintf("Repeated staged resource id '%08x' in staged aliases.", -                                       staged_id); +                                       duplicate_it->first);              return {};            } -        }        } break;        default:  |