From 1201ca70548fad85627eb5d303a5f8b3e674b243 Mon Sep 17 00:00:00 2001 From: Winson Date: Fri, 12 Apr 2019 16:19:26 -0700 Subject: [PATCH] Skip idmap1 generation if target defines overlayable Since idmap1 can't enforce policy restrictions, we can't allow it to generate an idmap that might get used. Migrating to idmap2 is too difficult for now as it requires a lot of PackageManager infrastructure to validate policies, and none of that is available during manifest parsing, which is where idmap1 is currently used. Bug: b/130260055 Test: manual test BT issue from b/130260055 Test: manual test app with test overlay toggling Activity enabled Change-Id: I5e7e321d27aab9be360a5e8be77d804ad3f66336 --- libs/androidfw/ResourceTypes.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/libs/androidfw/ResourceTypes.cpp b/libs/androidfw/ResourceTypes.cpp index 11e4cb835d65b..2ad2e76cc696f 100644 --- a/libs/androidfw/ResourceTypes.cpp +++ b/libs/androidfw/ResourceTypes.cpp @@ -3510,6 +3510,7 @@ struct ResTable::Package ResStringPool keyStrings; size_t typeIdOffset; + bool definesOverlayable = false; }; // A group of objects describing a particular resource package. @@ -6861,6 +6862,10 @@ status_t ResTable::parsePackage(const ResTable_package* const pkg, ALOGW("Found multiple library tables, ignoring..."); } } else { + if (ctype == RES_TABLE_OVERLAYABLE_TYPE) { + package->definesOverlayable = true; + } + status_t err = validate_chunk(chunk, sizeof(ResChunk_header), endPos, "ResTable_package:unknown"); if (err != NO_ERROR) { @@ -7138,6 +7143,11 @@ status_t ResTable::createIdmap(const ResTable& targetResTable, return UNKNOWN_ERROR; } + // Idmap is not aware of overlayable, exit since policy checks can't be done + if (targetResTable.mPackageGroups[0]->packages[0]->definesOverlayable) { + return UNKNOWN_ERROR; + } + const ResTable_package* targetPackageStruct = targetResTable.mPackageGroups[0]->packages[0]->package; const size_t tmpNameSize = arraysize(targetPackageStruct->name);