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

Commit 0c0e6a98 authored by Rhed Jao's avatar Rhed Jao Committed by Automerger Merge Worker
Browse files

Merge "Fix permanent denial of service via apis with illegal intent filter"...

Merge "Fix permanent denial of service via apis with illegal intent filter" into tm-qpr-dev am: 2e8ec835

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/20559211



Change-Id: I9aa6c68957a7b74810e7f04ace58d687b52e25bc
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 281d3ac8 2e8ec835
Loading
Loading
Loading
Loading
+23 −0
Original line number Original line Diff line number Diff line
@@ -2405,6 +2405,29 @@ public class IntentFilter implements Parcelable {
        */
        */
    }
    }


    /**
     * Perform a check on data paths and scheme specific parts of the intent filter.
     * Return true if it passed.
     * @hide
     */
    public boolean checkDataPathAndSchemeSpecificParts() {
        final int numDataPath = mDataPaths == null
                ? 0 : mDataPaths.size();
        final int numDataSchemeSpecificParts = mDataSchemeSpecificParts == null
                ? 0 : mDataSchemeSpecificParts.size();
        for (int i = 0; i < numDataPath; i++) {
            if (!mDataPaths.get(i).check()) {
                return false;
            }
        }
        for (int i = 0; i < numDataSchemeSpecificParts; i++) {
            if (!mDataSchemeSpecificParts.get(i).check()) {
                return false;
            }
        }
        return true;
    }

    /** @hide */
    /** @hide */
    public IntentFilter(Parcel source) {
    public IntentFilter(Parcel source) {
        mActions = new ArrayList<String>();
        mActions = new ArrayList<String>();
+18 −0
Original line number Original line Diff line number Diff line
@@ -16,6 +16,7 @@


package android.os;
package android.os;


import android.util.Log;
import android.util.proto.ProtoOutputStream;
import android.util.proto.ProtoOutputStream;


import java.util.Arrays;
import java.util.Arrays;
@@ -151,6 +152,23 @@ public class PatternMatcher implements Parcelable {
        proto.end(token);
        proto.end(token);
    }
    }


    /**
     * Perform a check on the matcher for the pattern type of {@link #PATTERN_ADVANCED_GLOB}.
     * Return true if it passed.
     * @hide
     */
    public boolean check() {
        try {
            if (mType == PATTERN_ADVANCED_GLOB) {
                return Arrays.equals(mParsedPattern, parseAndVerifyAdvancedPattern(mPattern));
            }
        } catch (IllegalArgumentException e) {
            Log.w(TAG, "Failed to verify advanced pattern: " + e.getMessage());
            return false;
        }
        return true;
    }

    public int describeContents() {
    public int describeContents() {
        return 0;
        return 0;
    }
    }
+5 −0
Original line number Original line Diff line number Diff line
@@ -3395,6 +3395,11 @@ public class PackageManagerService implements PackageSender, TestUtilityService
        enforceOwnerRights(snapshot, ownerPackage, callingUid);
        enforceOwnerRights(snapshot, ownerPackage, callingUid);
        PackageManagerServiceUtils.enforceShellRestriction(mInjector.getUserManagerInternal(),
        PackageManagerServiceUtils.enforceShellRestriction(mInjector.getUserManagerInternal(),
                UserManager.DISALLOW_DEBUGGING_FEATURES, callingUid, sourceUserId);
                UserManager.DISALLOW_DEBUGGING_FEATURES, callingUid, sourceUserId);
        if (!intentFilter.checkDataPathAndSchemeSpecificParts()) {
            EventLog.writeEvent(0x534e4554, "246749936", callingUid);
            throw new IllegalArgumentException("Invalid intent data paths or scheme specific parts"
                    + " in the filter.");
        }
        if (intentFilter.countActions() == 0) {
        if (intentFilter.countActions() == 0) {
            Slog.w(TAG, "Cannot set a crossProfile intent filter with no filter actions");
            Slog.w(TAG, "Cannot set a crossProfile intent filter with no filter actions");
            return;
            return;
+6 −0
Original line number Original line Diff line number Diff line
@@ -37,6 +37,7 @@ import android.os.Build;
import android.os.Process;
import android.os.Process;
import android.os.UserHandle;
import android.os.UserHandle;
import android.text.TextUtils;
import android.text.TextUtils;
import android.util.EventLog;
import android.util.Log;
import android.util.Log;
import android.util.LogPrinter;
import android.util.LogPrinter;
import android.util.PrintStreamPrinter;
import android.util.PrintStreamPrinter;
@@ -388,6 +389,11 @@ final class PreferredActivityHelper {
            throw new SecurityException(
            throw new SecurityException(
                    "addPersistentPreferredActivity can only be run by the system");
                    "addPersistentPreferredActivity can only be run by the system");
        }
        }
        if (!filter.checkDataPathAndSchemeSpecificParts()) {
            EventLog.writeEvent(0x534e4554, "246749702", callingUid);
            throw new IllegalArgumentException("Invalid intent data paths or scheme specific parts"
                    + " in the filter.");
        }
        if (filter.countActions() == 0) {
        if (filter.countActions() == 0) {
            Slog.w(TAG, "Cannot set a preferred activity with no filter actions");
            Slog.w(TAG, "Cannot set a preferred activity with no filter actions");
            return;
            return;
+7 −0
Original line number Original line Diff line number Diff line
@@ -670,6 +670,13 @@ public class WatchedIntentFilter
        return mFilter.debugCheck();
        return mFilter.debugCheck();
    }
    }


    /**
     * @see IntentFilter#checkDataPathAndSchemeSpecificParts()
     */
    public boolean checkDataPathAndSchemeSpecificParts() {
        return mFilter.checkDataPathAndSchemeSpecificParts();
    }

    /**
    /**
     * @see IntentFilter#getHostsList()
     * @see IntentFilter#getHostsList()
     */
     */