summaryrefslogtreecommitdiff
path: root/tools/aapt2/java/ClassDefinition.cpp
diff options
context:
space:
mode:
authorAdam Lesinski <adamlesinski@google.com>2018-01-16 17:05:10 -0800
committerAdam Lesinski <adamlesinski@google.com>2018-01-16 17:06:33 -0800
commita4fb17bbbba59c5ee92402eb8c5da4e3c52560b2 (patch)
tree5b89566ac4d6cbd47a892211be26ff5948d6a28f /tools/aapt2/java/ClassDefinition.cpp
parentd6808dc0c00ba45fd589449647f792daf9fa8126 (diff)
aapt2: Fix issue with Manifest duplicate handling
Fixed a memory-corruption issue that led to multiple duplicate permission entries being generated for Manifest.java. Bug: 71641288 Test: make aapt2_tests Change-Id: I8cd37929c4883aaba2beebbf874c7ee3234d51d8
Diffstat (limited to 'tools/aapt2/java/ClassDefinition.cpp')
-rw-r--r--tools/aapt2/java/ClassDefinition.cpp14
1 files changed, 12 insertions, 2 deletions
diff --git a/tools/aapt2/java/ClassDefinition.cpp b/tools/aapt2/java/ClassDefinition.cpp
index b692ccf7e52d..f5f5b05491bb 100644
--- a/tools/aapt2/java/ClassDefinition.cpp
+++ b/tools/aapt2/java/ClassDefinition.cpp
@@ -45,8 +45,18 @@ ClassDefinition::Result ClassDefinition::AddMember(std::unique_ptr<ClassMember>
Result result = Result::kAdded;
auto iter = indexed_members_.find(member->GetName());
if (iter != indexed_members_.end()) {
- // Overwrite the entry.
- ordered_members_[iter->second].reset();
+ // Overwrite the entry. Be careful, as the key in indexed_members_ is actually memory owned
+ // by the value at ordered_members_[index]. Since overwriting a value for a key doesn't replace
+ // the key (the initial key inserted into the unordered_map is kept), we must erase and then
+ // insert a new key, whose memory is being kept around. We do all this to avoid using more
+ // memory for each key.
+ size_t index = iter->second;
+
+ // Erase the key + value from the map.
+ indexed_members_.erase(iter);
+
+ // Now clear the memory that was backing the key (now erased).
+ ordered_members_[index].reset();
result = Result::kOverridden;
}