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

Commit d7f2a752 authored by Songchun Fan's avatar Songchun Fan
Browse files

[pm] restrict max number of components at parsing

Apps with too many components can cause the system to be unresponsive. Adding a max number restriction in the parsing so that such apps will be rejected during installation. The current max number is chosen based on the stats of Play apps.

Test: manual
$ adb install app-debug.apk
Performing Streamed Install

adb: failed to install /usr/local/google/home/schfan/Downloads/app-debug.apk: Failure [INSTALL_PARSE_FAILED_MANIFEST_MALFORMED: Failed parse during installPackageLI: /data/app/vmdl1065528371.tmp/base.apk (at Binary XML file line #300021): Total number of components has exceeded the maximum number: 30000]

BUG: 214397059
Change-Id: Iae22f66db8434533efffa8db2ed72e0d23534100
parent 90c8fc93
Loading
Loading
Loading
Loading
+17 −0
Original line number Diff line number Diff line
@@ -239,6 +239,11 @@ public class ParsingPackageUtils {

    public static final int PARSE_CHATTY = 1 << 31;

    /** The total maximum number of activities, services, providers and activity-aliases */
    private static final int MAX_NUM_COMPONENTS = 30000;
    private static final String MAX_NUM_COMPONENTS_ERR_MSG =
            "Total number of components has exceeded the maximum number: " + MAX_NUM_COMPONENTS;

    @IntDef(flag = true, prefix = { "PARSE_" }, value = {
            PARSE_CHATTY,
            PARSE_COLLECT_CERTIFICATES,
@@ -834,11 +839,20 @@ public class ParsingPackageUtils {
            if (result.isError()) {
                return input.error(result);
            }

            if (hasTooManyComponents(pkg)) {
                return input.error(MAX_NUM_COMPONENTS_ERR_MSG);
            }
        }

        return input.success(pkg);
    }

    private static boolean hasTooManyComponents(ParsingPackage pkg) {
        return pkg.getActivities().size() + pkg.getServices().size() + pkg.getProviders().size()
                > MAX_NUM_COMPONENTS;
    }

    /**
     * For parsing non-MainComponents. Main ones have an order and some special handling which is
     * done directly in {@link #parseSplitApplication(ParseInput, ParsingPackage, Resources,
@@ -2125,6 +2139,9 @@ public class ParsingPackageUtils {
            if (result.isError()) {
                return input.error(result);
            }
            if (hasTooManyComponents(pkg)) {
                return input.error(MAX_NUM_COMPONENTS_ERR_MSG);
            }
        }

        if (TextUtils.isEmpty(pkg.getStaticSharedLibName()) && TextUtils.isEmpty(