Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 631c96ea authored by Xavier Ducrohet's avatar Xavier Ducrohet
Browse files

Fix potential aapt crash when processing overlay. (do not merge)

If an overlay has a type of resources that's not defined in
the main res pool, then aapt would crash.

This dynamically create new ResourceTypeSet when needed
when processing the overlays

Change-Id: I2fd953e3e5ebfb57206ced62eaca71e2919a4c26
parent af4786bc
Loading
Loading
Loading
Loading
+18 −11
Original line number Diff line number Diff line
@@ -430,7 +430,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()) {
@@ -458,13 +458,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();
@@ -503,8 +506,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);
@@ -649,13 +656,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;
    }