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

Commit 5d9f47d6 authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Do not crash when duplication found in merged imsi list" am: 0d7ec633...

Merge "Do not crash when duplication found in merged imsi list" am: 0d7ec633 am: 350a4b3c am: 6b7cb8d2 am: 86b971c2 am: fd983cb7

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



Change-Id: Ie85ce0f5e7a5da1ba87031fee7b83c5e80569f38
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 8963035c fd983cb7
Loading
Loading
Loading
Loading
+10 −2
Original line number Diff line number Diff line
@@ -123,6 +123,7 @@ import static android.telephony.CarrierConfigManager.KEY_DATA_RAPID_NOTIFICATION
import static android.telephony.CarrierConfigManager.KEY_DATA_WARNING_NOTIFICATION_BOOL;
import static android.telephony.SubscriptionManager.INVALID_SUBSCRIPTION_ID;

import static com.android.internal.annotations.VisibleForTesting.Visibility.PRIVATE;
import static com.android.internal.util.ArrayUtils.appendInt;
import static com.android.internal.util.XmlUtils.readBooleanAttribute;
import static com.android.internal.util.XmlUtils.readIntAttribute;
@@ -3158,7 +3159,8 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
     * active merge set [A,B], we'd return a new template that primarily matches
     * A, but also matches B.
     */
    private static NetworkTemplate normalizeTemplate(@NonNull NetworkTemplate template,
    @VisibleForTesting(visibility = PRIVATE)
    static NetworkTemplate normalizeTemplate(@NonNull NetworkTemplate template,
            @NonNull List<String[]> mergedList) {
        // Now there are several types of network which uses Subscriber Id to store network
        // information. For instance:
@@ -3168,6 +3170,12 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
        if (template.getSubscriberIds().isEmpty()) return template;

        for (final String[] merged : mergedList) {
            // In some rare cases (e.g. b/243015487), merged subscriberId list might contain
            // duplicated items. Deduplication for better error handling.
            final ArraySet mergedSet = new ArraySet(merged);
            if (mergedSet.size() != merged.length) {
                Log.wtf(TAG, "Duplicated merged list detected: " + Arrays.toString(merged));
            }
            // TODO: Handle incompatible subscriberIds if that happens in practice.
            for (final String subscriberId : template.getSubscriberIds()) {
                if (com.android.net.module.util.CollectionUtils.contains(merged, subscriberId)) {
@@ -3175,7 +3183,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
                    // a template that matches all merged subscribers.
                    return new NetworkTemplate.Builder(template.getMatchRule())
                            .setWifiNetworkKeys(template.getWifiNetworkKeys())
                            .setSubscriberIds(Set.of(merged))
                            .setSubscriberIds(mergedSet)
                            .setMeteredness(template.getMeteredness())
                            .build();
                }
+13 −0
Original line number Diff line number Diff line
@@ -75,6 +75,7 @@ import static com.android.server.net.NetworkPolicyManagerService.TYPE_LIMIT_SNOO
import static com.android.server.net.NetworkPolicyManagerService.TYPE_RAPID;
import static com.android.server.net.NetworkPolicyManagerService.TYPE_WARNING;
import static com.android.server.net.NetworkPolicyManagerService.UidBlockedState.getEffectiveBlockedReasons;
import static com.android.server.net.NetworkPolicyManagerService.normalizeTemplate;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -2030,6 +2031,18 @@ public class NetworkPolicyManagerServiceTest {
                METERED_NO, actualPolicy.template.getMeteredness());
    }

    @Test
    public void testNormalizeTemplate_duplicatedMergedImsiList() {
        final NetworkTemplate template = new NetworkTemplate.Builder(MATCH_CARRIER)
                .setSubscriberIds(Set.of(TEST_IMSI)).build();
        final String[] mergedImsiGroup = new String[] {TEST_IMSI, TEST_IMSI};
        final ArrayList<String[]> mergedList = new ArrayList<>();
        mergedList.add(mergedImsiGroup);
        // Verify the duplicated items in the merged IMSI list won't crash the system.
        final NetworkTemplate result = normalizeTemplate(template, mergedList);
        assertEquals(template, result);
    }

    private String formatBlockedStateError(int uid, int rule, boolean metered,
            boolean backgroundRestricted) {
        return String.format(