From 081d1b4cf602fdd7302b597e6bf902cb415bc3a8 Mon Sep 17 00:00:00 2001 From: Adam Lesinski Date: Mon, 15 Aug 2016 18:45:00 -0700 Subject: 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 --- tools/aapt/ResourceTable.cpp | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) (limited to 'tools/aapt/ResourceTable.cpp') diff --git a/tools/aapt/ResourceTable.cpp b/tools/aapt/ResourceTable.cpp index 76c59dd57068..661409e3d4bc 100644 --- a/tools/aapt/ResourceTable.cpp +++ b/tools/aapt/ResourceTable.cpp @@ -4860,24 +4860,39 @@ void ResourceTable::getDensityVaryingResources( const Vector >& types = mOrderedPackages[p]->getOrderedTypes(); const size_t typeCount = types.size(); for (size_t t = 0; t < typeCount; t++) { - const Vector >& configs = types[t]->getOrderedConfigs(); + const sp& type = types[t]; + if (type == NULL) { + continue; + } + + const Vector >& configs = type->getOrderedConfigs(); const size_t configCount = configs.size(); for (size_t c = 0; c < configCount; c++) { + const sp& configList = configs[c]; + if (configList == NULL) { + continue; + } + const DefaultKeyedVector >& configEntries - = configs[c]->getEntries(); + = configList->getEntries(); const size_t configEntryCount = configEntries.size(); for (size_t ce = 0; ce < configEntryCount; ce++) { + const sp& 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 = configEntries.valueAt(ce); AaptUtil::appendValue(resources, symbol, SymbolDefinition(symbol, config, entry->getPos())); } -- cgit v1.2.3-59-g8ed1b