Fix race condition when TelephonyRegistry handles multi-SIM config change
TelephonyRegistry only updates some internal statuses related to active modem count after receiving ACTION_MULTI_SIM_CONFIG_CHANGED. If another component receives the same intent firstly and calls TelephonyRegistryManager to either register or notify an event, the internal status related to active modem count may not be able to update yet, causing IAE saying e.g. phoneId is invalid. To fix the issue, onMultiSimConfigChanged will be called to update the internal statuses firstly before accessing them. Bug: 230799289 Fix: 230773760 Test: atest TelephonyRegistryTest Test: manual DS<->SS switching test Change-Id: I31506a07406dee424546bfe4927e069280a7b011
This commit is contained in:
@@ -2803,6 +2803,11 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
|
||||
+ " callback.asBinder=" + callback.asBinder());
|
||||
}
|
||||
|
||||
// In case this is triggered from the caller who has handled multiple SIM config change
|
||||
// firstly, we need to update the status (mNumPhone and mCarrierPrivilegeStates) firstly.
|
||||
// This is almost a no-op if there is no multiple SIM config change in advance.
|
||||
onMultiSimConfigChanged();
|
||||
|
||||
synchronized (mRecords) {
|
||||
if (!validatePhoneId(phoneId)) {
|
||||
throw new IllegalArgumentException("Invalid slot index: " + phoneId);
|
||||
@@ -2865,6 +2870,12 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
|
||||
+ ", <packages=" + pii(privilegedPackageNames)
|
||||
+ ", uids=" + Arrays.toString(privilegedUids) + ">");
|
||||
}
|
||||
|
||||
// In case this is triggered from the caller who has handled multiple SIM config change
|
||||
// firstly, we need to update the status (mNumPhone and mCarrierPrivilegeStates) firstly.
|
||||
// This is almost a no-op if there is no multiple SIM config change in advance.
|
||||
onMultiSimConfigChanged();
|
||||
|
||||
synchronized (mRecords) {
|
||||
if (!validatePhoneId(phoneId)) {
|
||||
throw new IllegalArgumentException("Invalid slot index: " + phoneId);
|
||||
@@ -2900,6 +2911,11 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
|
||||
+ ", package=" + pii(packageName) + ", uid=" + uid);
|
||||
}
|
||||
|
||||
// In case this is triggered from the caller who has handled multiple SIM config change
|
||||
// firstly, we need to update the status (mNumPhone and mCarrierServiceStates) firstly.
|
||||
// This is almost a no-op if there is no multiple SIM config change in advance.
|
||||
onMultiSimConfigChanged();
|
||||
|
||||
synchronized (mRecords) {
|
||||
mCarrierServiceStates.set(
|
||||
phoneId, new Pair<>(packageName, uid));
|
||||
@@ -3365,7 +3381,8 @@ public class TelephonyRegistry extends ITelephonyRegistry.Stub {
|
||||
}
|
||||
|
||||
private boolean validatePhoneId(int phoneId) {
|
||||
boolean valid = (phoneId >= 0) && (phoneId < mNumPhones);
|
||||
// Call getActiveModemCount to get the latest value instead of depending on mNumPhone
|
||||
boolean valid = (phoneId >= 0) && (phoneId < getTelephonyManager().getActiveModemCount());
|
||||
if (VDBG) log("validatePhoneId: " + valid);
|
||||
return valid;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user