summaryrefslogtreecommitdiff
path: root/tools/aapt/ResourceTable.cpp
diff options
context:
space:
mode:
author Adam Lesinski <adamlesinski@google.com> 2016-08-15 18:45:00 -0700
committer Adam Lesinski <adamlesinski@google.com> 2016-08-17 19:53:01 +0000
commit26ae640c348eb12e2273887280970cd53675a032 (patch)
tree550cfad11c8b50571e3a435b7bb0e8e515eaed64 /tools/aapt/ResourceTable.cpp
parent97632afe5ecb0c35366167e3dfd0aa6258ab276f (diff)
AAPT: Handle gaps in resources when building splits
Due to public ID assignment, gaps in resource type and entry IDs can occur. This can lead to null pointer dereferencing if not careful. This happened in ResourceTable::getDensityVaryingResources() which is called when building Splits. Bug:30879690 Change-Id: I588e4dcd2e042fccfcb2e87967b5cbd0d23b4497 (cherry picked from commit 081d1b4cf602fdd7302b597e6bf902cb415bc3a8)
Diffstat (limited to 'tools/aapt/ResourceTable.cpp')
-rw-r--r--tools/aapt/ResourceTable.cpp27
1 files changed, 21 insertions, 6 deletions
diff --git a/tools/aapt/ResourceTable.cpp b/tools/aapt/ResourceTable.cpp
index 4d5bb312aaf1..9cae00f778b4 100644
--- a/tools/aapt/ResourceTable.cpp
+++ b/tools/aapt/ResourceTable.cpp
@@ -4860,24 +4860,39 @@ void ResourceTable::getDensityVaryingResources(
const Vector<sp<Type> >& types = mOrderedPackages[p]->getOrderedTypes();
const size_t typeCount = types.size();
for (size_t t = 0; t < typeCount; t++) {
- const Vector<sp<ConfigList> >& configs = types[t]->getOrderedConfigs();
+ const sp<Type>& type = types[t];
+ if (type == NULL) {
+ continue;
+ }
+
+ const Vector<sp<ConfigList> >& configs = type->getOrderedConfigs();
const size_t configCount = configs.size();
for (size_t c = 0; c < configCount; c++) {
+ const sp<ConfigList>& configList = configs[c];
+ if (configList == NULL) {
+ continue;
+ }
+
const DefaultKeyedVector<ConfigDescription, sp<Entry> >& configEntries
- = configs[c]->getEntries();
+ = configList->getEntries();
const size_t configEntryCount = configEntries.size();
for (size_t ce = 0; ce < configEntryCount; ce++) {
+ const sp<Entry>& entry = configEntries.valueAt(ce);
+ if (entry == NULL) {
+ continue;
+ }
+
const ConfigDescription& config = configEntries.keyAt(ce);
if (AaptConfig::isDensityOnly(config)) {
// This configuration only varies with regards to density.
const Symbol symbol(
mOrderedPackages[p]->getName(),
- types[t]->getName(),
- configs[c]->getName(),
+ type->getName(),
+ configList->getName(),
getResId(mOrderedPackages[p], types[t],
- configs[c]->getEntryIndex()));
+ configList->getEntryIndex()));
+
- const sp<Entry>& entry = configEntries.valueAt(ce);
AaptUtil::appendValue(resources, symbol,
SymbolDefinition(symbol, config, entry->getPos()));
}