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

Commit 0c2dcd35 authored by Michael Groover's avatar Michael Groover
Browse files

Revert "Remove redundant SubInfo list identifier access checks"

This reverts commit b6a27a1b.

Reason for revert: While this commit improves the performance for a
single invocation of getSubscriptionInfoListFromCacheHelper for an
app without device identifier access the permission checks within
the synchronized block significantly impact performance for multiple
parallel invocations.

Bug: 157642567
Test: atest SubscriptionControllerTest
Change-Id: Id7281db373187746118090e594ddfe0cccf079e9
parent 9e974c13
Loading
Loading
Loading
Loading
+24 −1
Original line number Diff line number Diff line
@@ -3611,7 +3611,7 @@ public class SubscriptionController extends ISub.Stub {
                    callingPackage, callingFeatureId, "getSubscriptionsInGroup")
                    || info.canManageSubscription(mContext, callingPackage);
        }).map(subscriptionInfo -> conditionallyRemoveIdentifiers(subscriptionInfo,
                callingPackage, callingFeatureId, "getSubscriptionsInGroup"))
                callingPackage, callingFeatureId, "getSubscriptionInfoList"))
        .collect(Collectors.toList());

    }
@@ -3897,7 +3897,30 @@ public class SubscriptionController extends ISub.Stub {
    // They are doing similar things except operating on different cache.
    private List<SubscriptionInfo> getSubscriptionInfoListFromCacheHelper(
            String callingPackage, String callingFeatureId, List<SubscriptionInfo> cacheSubList) {
        boolean canReadAllPhoneState;
        try {
            canReadAllPhoneState = TelephonyPermissions.checkReadPhoneState(mContext,
                    SubscriptionManager.INVALID_SUBSCRIPTION_ID, Binder.getCallingPid(),
                    Binder.getCallingUid(), callingPackage, callingFeatureId,
                    "getSubscriptionInfoList");
            // If the calling package has the READ_PHONE_STATE permission then check if the caller
            // also has access to subscriber identifiers to ensure that the ICC ID and any other
            // unique identifiers are removed if the caller should not have access.
            if (canReadAllPhoneState) {
                canReadAllPhoneState = hasSubscriberIdentifierAccess(
                        SubscriptionManager.INVALID_SUBSCRIPTION_ID, callingPackage,
                        callingFeatureId, "getSubscriptionInfoList");
            }
        } catch (SecurityException e) {
            canReadAllPhoneState = false;
        }

        synchronized (mSubInfoListLock) {
            // If the caller can read all phone state, just return the full list.
            if (canReadAllPhoneState) {
                return new ArrayList<>(cacheSubList);
            }

            // Filter the list to only include subscriptions which the caller can manage.
            return cacheSubList.stream()
                    .filter(subscriptionInfo -> {