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);