Add Extra Exception Checks to Null Cipher Toggle
Adds broad exception safety to all TelephonyManager calls.
Without these extra catch blocks, the entire Settings app would
crash if a TelephonyManager API were to throw an exception.
Bug: 262914591
Test: atest NullAlgorithmsPreferenceControllerTest
Change-Id: I997a37fe71bf007d67989c89b3abe3e520d79d3c
diff --git a/src/com/android/settings/network/telephony/NullAlgorithmsPreferenceController.java b/src/com/android/settings/network/telephony/NullAlgorithmsPreferenceController.java
index c4fdcbd..cfb5344 100644
--- a/src/com/android/settings/network/telephony/NullAlgorithmsPreferenceController.java
+++ b/src/com/android/settings/network/telephony/NullAlgorithmsPreferenceController.java
@@ -69,6 +69,12 @@
} catch (UnsupportedOperationException e) {
Log.i(LOG_TAG, "Null cipher enablement is unsupported: " + e.getMessage());
return UNSUPPORTED_ON_DEVICE;
+ } catch (Exception e) {
+ Log.e(LOG_TAG,
+ "Failed isNullCipherAndIntegrityEnabled. Setting availability to "
+ + "CONDITIONALLY_UNAVAILABLE. Exception: "
+ + e.getMessage());
+ return CONDITIONALLY_UNAVAILABLE;
}
return AVAILABLE;
@@ -83,7 +89,16 @@
*/
@Override
public boolean isChecked() {
- return mTelephonyManager.isNullCipherAndIntegrityPreferenceEnabled();
+ try {
+ return mTelephonyManager.isNullCipherAndIntegrityPreferenceEnabled();
+ } catch (Exception e) {
+ Log.e(LOG_TAG,
+ "Failed isNullCipherAndIntegrityEnabled. Defaulting toggle to "
+ + "checked = true. Exception: "
+ + e.getMessage());
+ }
+ // The default behavior for this toggle is enabled
+ return true;
}
/**
@@ -105,7 +120,15 @@
} else {
Log.i(LOG_TAG, "Disabling null algorithms");
}
- mTelephonyManager.setNullCipherAndIntegrityEnabled(isChecked);
+ try {
+ mTelephonyManager.setNullCipherAndIntegrityEnabled(isChecked);
+ } catch (Exception e) {
+ Log.e(LOG_TAG,
+ "Failed setNullCipherAndIntegrityEnabled. Setting not updated. Exception: "
+ + e.getMessage());
+ // The underlying setting was not updated
+ return false;
+ }
return true;
}
}
diff --git a/tests/unit/src/com/android/settings/network/telephony/NullAlgorithmsPreferenceControllerTest.java b/tests/unit/src/com/android/settings/network/telephony/NullAlgorithmsPreferenceControllerTest.java
index e57dfcd..99d0a43 100644
--- a/tests/unit/src/com/android/settings/network/telephony/NullAlgorithmsPreferenceControllerTest.java
+++ b/tests/unit/src/com/android/settings/network/telephony/NullAlgorithmsPreferenceControllerTest.java
@@ -21,6 +21,7 @@
import static com.google.common.truth.Truth.assertThat;
+import static org.junit.Assert.assertFalse;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.spy;
@@ -120,6 +121,16 @@
}
@Test
+ public void getAvailabilityStatus_telephonyManagerException_conditionallyUnavailable() {
+ DeviceConfig.setProperty(DeviceConfig.NAMESPACE_CELLULAR_SECURITY,
+ TelephonyManager.PROPERTY_ENABLE_NULL_CIPHER_TOGGLE, Boolean.TRUE.toString(),
+ false);
+ doThrow(IllegalStateException.class).when(
+ mTelephonyManager).isNullCipherAndIntegrityPreferenceEnabled();
+ assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE);
+ }
+
+ @Test
public void getAvailabilityStatus_returnAvailable() {
DeviceConfig.setProperty(DeviceConfig.NAMESPACE_CELLULAR_SECURITY,
TelephonyManager.PROPERTY_ENABLE_NULL_CIPHER_TOGGLE, Boolean.TRUE.toString(),
@@ -141,4 +152,12 @@
mController.setChecked(false);
verify(mTelephonyManager, times(1)).setNullCipherAndIntegrityEnabled(false);
}
+
+ @Test
+ public void setChecked_exceptionThrown() {
+ doThrow(IllegalStateException.class).when(
+ mTelephonyManager).setNullCipherAndIntegrityEnabled(true);
+ assertFalse(mController.setChecked(true));
+ verify(mTelephonyManager, times(1)).setNullCipherAndIntegrityEnabled(true);
+ }
}