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
This commit is contained in:
@@ -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()));
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user