From b51b7274062968044521ecb8cd4e7017fb916dd8 Mon Sep 17 00:00:00 2001 From: rambowang Date: Wed, 20 Mar 2024 18:41:14 +0000 Subject: Fix VCN crash when retrieving carrier config while phone is gone This CL calls CarrierConfigManager.getCarrierConfigSubset instead of getConfigForSubId to guard against crashing when phone process has gone. The former method is designed for system components to retrieve carrier configs with consideration of phone process may be gone (e.g. during rebooting from previous crash). Bug: 319791612 Test: atest TelephonySubscriptionTrackerTest (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:d7ebd7c10712a8a319ae6117949d4ece92be4de8) Merged-In: I784610b243db2a666c1fe89b1438950a2f6a1478 Change-Id: I784610b243db2a666c1fe89b1438950a2f6a1478 --- .../server/vcn/TelephonySubscriptionTracker.java | 9 +++++++-- tests/vcn/Android.bp | 1 + .../server/vcn/TelephonySubscriptionTrackerTest.java | 19 +++++++++++++++++++ 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/vcn/TelephonySubscriptionTracker.java b/services/core/java/com/android/server/vcn/TelephonySubscriptionTracker.java index 099c9ae33bfb..17f5e9585c22 100644 --- a/services/core/java/com/android/server/vcn/TelephonySubscriptionTracker.java +++ b/services/core/java/com/android/server/vcn/TelephonySubscriptionTracker.java @@ -44,6 +44,7 @@ import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.annotations.VisibleForTesting.Visibility; +import com.android.internal.telephony.flags.Flags; import com.android.internal.util.IndentingPrintWriter; import com.android.server.vcn.util.PersistableBundleUtils.PersistableBundleWrapper; @@ -318,8 +319,12 @@ public class TelephonySubscriptionTracker extends BroadcastReceiver { if (SubscriptionManager.isValidSubscriptionId(subId)) { // Get only configs as needed to save memory. - final PersistableBundle carrierConfig = mCarrierConfigManager.getConfigForSubId(subId, - VcnManager.VCN_RELATED_CARRIER_CONFIG_KEYS); + final PersistableBundle carrierConfig = + Flags.fixCrashOnGettingConfigWhenPhoneIsGone() + ? CarrierConfigManager.getCarrierConfigSubset(mContext, subId, + VcnManager.VCN_RELATED_CARRIER_CONFIG_KEYS) + : mCarrierConfigManager.getConfigForSubId(subId, + VcnManager.VCN_RELATED_CARRIER_CONFIG_KEYS); if (mDeps.isConfigForIdentifiedCarrier(carrierConfig)) { mReadySubIdsBySlotId.put(slotId, subId); diff --git a/tests/vcn/Android.bp b/tests/vcn/Android.bp index bc1df75bb142..ee2e7cfcd480 100644 --- a/tests/vcn/Android.bp +++ b/tests/vcn/Android.bp @@ -31,6 +31,7 @@ android_test { "platform-test-annotations", "services.core", "service-connectivity-tiramisu-pre-jarjar", + "flag-junit", ], libs: [ "android.test.runner", diff --git a/tests/vcn/java/com/android/server/vcn/TelephonySubscriptionTrackerTest.java b/tests/vcn/java/com/android/server/vcn/TelephonySubscriptionTrackerTest.java index 34f884b94296..887630b03a8c 100644 --- a/tests/vcn/java/com/android/server/vcn/TelephonySubscriptionTrackerTest.java +++ b/tests/vcn/java/com/android/server/vcn/TelephonySubscriptionTrackerTest.java @@ -38,6 +38,7 @@ import static org.mockito.ArgumentMatchers.argThat; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.reset; import static org.mockito.Mockito.times; @@ -58,6 +59,7 @@ import android.os.HandlerExecutor; import android.os.ParcelUuid; import android.os.PersistableBundle; import android.os.test.TestLooper; +import android.platform.test.flag.junit.SetFlagsRule; import android.telephony.CarrierConfigManager; import android.telephony.SubscriptionInfo; import android.telephony.SubscriptionManager; @@ -71,7 +73,10 @@ import android.util.ArraySet; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; +import com.android.internal.telephony.flags.Flags; + import org.junit.Before; +import org.junit.Rule; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; @@ -128,6 +133,9 @@ public class TelephonySubscriptionTrackerTest { TEST_SUBID_TO_CARRIER_CONFIG_MAP = Collections.unmodifiableMap(subIdToCarrierConfigMap); } + @Rule public final SetFlagsRule mSetFlagsRule = new SetFlagsRule(); + + @NonNull private final Context mContext; @NonNull private final TestLooper mTestLooper; @NonNull private final Handler mHandler; @@ -185,6 +193,7 @@ public class TelephonySubscriptionTrackerTest { @Before public void setUp() throws Exception { + mSetFlagsRule.enableFlags(Flags.FLAG_FIX_CRASH_ON_GETTING_CONFIG_WHEN_PHONE_IS_GONE); doReturn(2).when(mTelephonyManager).getActiveModemCount(); mCallback = mock(TelephonySubscriptionTrackerCallback.class); @@ -594,4 +603,14 @@ public class TelephonySubscriptionTrackerTest { new ArraySet<>(Arrays.asList(TEST_SUBSCRIPTION_ID_1, TEST_SUBSCRIPTION_ID_2)), snapshot.getAllSubIdsInGroup(TEST_PARCEL_UUID)); } + + @Test + public void testCarrierConfigChangeWhenPhoneIsGoneShouldNotCrash() throws Exception { + doThrow(new IllegalStateException("Carrier config loader is not available.")) + .when(mCarrierConfigManager) + .getConfigForSubId(eq(TEST_SUBSCRIPTION_ID_1), any()); + + sendCarrierConfigChange(true /* hasValidSubscription */); + mTestLooper.dispatchAll(); + } } -- cgit v1.2.3-59-g8ed1b