diff options
author | Xavier Ducrohet <xav@android.com> | 2010-03-05 11:22:40 -0800 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2010-03-05 11:22:40 -0800 |
commit | ee2b21dba2740dcb47a68b8d1ed671b425c96948 (patch) | |
tree | 651220603a43fda59bb6dce1d053d53f5dc1da21 | |
parent | bda5780d39d5483dea938f2b64f6b2e0fb383e22 (diff) | |
parent | 83f4c0994fd34f9b35eeb2c14908d9e6c2e15930 (diff) | |
download | frameworks_base-ee2b21dba2740dcb47a68b8d1ed671b425c96948.zip frameworks_base-ee2b21dba2740dcb47a68b8d1ed671b425c96948.tar.gz frameworks_base-ee2b21dba2740dcb47a68b8d1ed671b425c96948.tar.bz2 |
Merge "Fix potential aapt crash when processing overlay."
-rw-r--r-- | tools/aapt/Resource.cpp | 29 |
1 files changed, 18 insertions, 11 deletions
diff --git a/tools/aapt/Resource.cpp b/tools/aapt/Resource.cpp index ea021d8..b7580b3 100644 --- a/tools/aapt/Resource.cpp +++ b/tools/aapt/Resource.cpp @@ -447,7 +447,7 @@ static void checkForIds(const String8& path, ResXMLParser& parser) static bool applyFileOverlay(Bundle *bundle, const sp<AaptAssets>& assets, - const sp<ResourceTypeSet>& baseSet, + sp<ResourceTypeSet> *baseSet, const char *resType) { if (bundle->getVerbose()) { @@ -475,13 +475,16 @@ static bool applyFileOverlay(Bundle *bundle, if (bundle->getVerbose()) { printf("trying overlaySet Key=%s\n",overlaySet->keyAt(overlayIndex).string()); } - size_t baseIndex = baseSet->indexOfKey(overlaySet->keyAt(overlayIndex)); + size_t baseIndex = UNKNOWN_ERROR; + if (baseSet->get() != NULL) { + baseIndex = (*baseSet)->indexOfKey(overlaySet->keyAt(overlayIndex)); + } if (baseIndex < UNKNOWN_ERROR) { // look for same flavor. For a given file (strings.xml, for example) // there may be a locale specific or other flavors - we want to match // the same flavor. sp<AaptGroup> overlayGroup = overlaySet->valueAt(overlayIndex); - sp<AaptGroup> baseGroup = baseSet->valueAt(baseIndex); + sp<AaptGroup> baseGroup = (*baseSet)->valueAt(baseIndex); DefaultKeyedVector<AaptGroupEntry, sp<AaptFile> > overlayFiles = overlayGroup->getFiles(); @@ -520,8 +523,12 @@ static bool applyFileOverlay(Bundle *bundle, assets->addGroupEntry(overlayFiles.keyAt(overlayGroupIndex)); } } else { + if (baseSet->get() == NULL) { + *baseSet = new ResourceTypeSet(); + assets->getResources()->add(String8(resType), *baseSet); + } // this group doesn't exist (a file that's only in the overlay) - baseSet->add(overlaySet->keyAt(overlayIndex), + (*baseSet)->add(overlaySet->keyAt(overlayIndex), overlaySet->valueAt(overlayIndex)); // make sure all flavors are defined in the resources. sp<AaptGroup> overlayGroup = overlaySet->valueAt(overlayIndex); @@ -751,13 +758,13 @@ status_t buildResources(Bundle* bundle, const sp<AaptAssets>& assets) current = current->getOverlay(); } // apply the overlay files to the base set - if (!applyFileOverlay(bundle, assets, drawables, "drawable") || - !applyFileOverlay(bundle, assets, layouts, "layout") || - !applyFileOverlay(bundle, assets, anims, "anim") || - !applyFileOverlay(bundle, assets, xmls, "xml") || - !applyFileOverlay(bundle, assets, raws, "raw") || - !applyFileOverlay(bundle, assets, colors, "color") || - !applyFileOverlay(bundle, assets, menus, "menu")) { + if (!applyFileOverlay(bundle, assets, &drawables, "drawable") || + !applyFileOverlay(bundle, assets, &layouts, "layout") || + !applyFileOverlay(bundle, assets, &anims, "anim") || + !applyFileOverlay(bundle, assets, &xmls, "xml") || + !applyFileOverlay(bundle, assets, &raws, "raw") || + !applyFileOverlay(bundle, assets, &colors, "color") || + !applyFileOverlay(bundle, assets, &menus, "menu")) { return UNKNOWN_ERROR; } |