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

Commit 56285d8f authored by Xavier Ducrohet's avatar Xavier Ducrohet Committed by Android (Google) Code Review
Browse files

Merge "Fix potential aapt crash when processing overlay. (do not merge)" into eclair

parents 72aadeb0 631c96ea
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;
    }