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

Commit 6569625b authored by Dianne Hackborn's avatar Dianne Hackborn
Browse files

Fix issues #6103378 and #5959515.

Change-Id: I762d86dd7119c9ac02f4b8803c4a250c6b7637c7
6103378: APR: IOOBE at android.content.pm.PackageParser.generatePackageInfo(
    PackageParser.java:355)
5959515: PackageManager doesn't validate className in setComponentEnabledSetting
parent c3b91e9a
Loading
Loading
Loading
Loading
+32 −2
Original line number Diff line number Diff line
@@ -944,7 +944,7 @@ public class PackageParser {

                if (name != null && !pkg.requestedPermissions.contains(name)) {
                    pkg.requestedPermissions.add(name.intern());
                    pkg.requestedPermissionsRequired.add(required);
                    pkg.requestedPermissionsRequired.add(required ? Boolean.TRUE : Boolean.FALSE);
                }

                XmlUtils.skipCurrentTag(parser);
@@ -1239,6 +1239,7 @@ public class PackageParser {
                }
                implicitPerms.append(npi.name);
                pkg.requestedPermissions.add(npi.name);
                pkg.requestedPermissionsRequired.add(Boolean.TRUE);
            }
        }
        if (implicitPerms != null) {
@@ -3083,6 +3084,35 @@ public class PackageParser {
            }
        }

        public boolean hasComponentClassName(String name) {
            for (int i=activities.size()-1; i>=0; i--) {
                if (name.equals(activities.get(i).className)) {
                    return true;
                }
            }
            for (int i=receivers.size()-1; i>=0; i--) {
                if (name.equals(receivers.get(i).className)) {
                    return true;
                }
            }
            for (int i=providers.size()-1; i>=0; i--) {
                if (name.equals(providers.get(i).className)) {
                    return true;
                }
            }
            for (int i=services.size()-1; i>=0; i--) {
                if (name.equals(services.get(i).className)) {
                    return true;
                }
            }
            for (int i=instrumentation.size()-1; i>=0; i--) {
                if (name.equals(instrumentation.get(i).className)) {
                    return true;
                }
            }
            return false;
        }

        public String toString() {
            return "Package{"
                + Integer.toHexString(System.identityHashCode(this))
+9 −0
Original line number Diff line number Diff line
@@ -371,6 +371,15 @@ public class Build {

        /**
         * Next up on Android!
         *
         * <p>Applications targeting this or a later release will get these
         * new changes in behavior:</p>
         * <ul>
         * <li> Calls to {@link android.content.pm.PackageManager#setComponentEnabledSetting
         * PackageManager.setComponentEnabledSetting} will now throw an
         * IllegalArgumentException if the given component class name does not
         * exist in the application's manifest.
         * </ul>
         */
        public static final int JELLY_BEAN = CUR_DEVELOPMENT;
    }
+11 −0
Original line number Diff line number Diff line
@@ -7744,6 +7744,17 @@ public class PackageManagerService extends IPackageManager.Stub {
                pkgSetting.pkg.mSetEnabled = newState;
            } else {
                // We're dealing with a component level state change
                // First, verify that this is a valid class name.
                PackageParser.Package pkg = pkgSetting.pkg;
                if (pkg == null || !pkg.hasComponentClassName(className)) {
                    if (pkg.applicationInfo.targetSdkVersion >= Build.VERSION_CODES.JELLY_BEAN) {
                        throw new IllegalArgumentException("Component class " + className
                                + " does not exist in " + packageName);
                    } else {
                        Slog.w(TAG, "Failed setComponentEnabledSetting: component class "
                                + className + " does not exist in " + packageName);
                    }
                }
                switch (newState) {
                case COMPONENT_ENABLED_STATE_ENABLED:
                    if (!pkgSetting.enableComponentLPw(className)) {