From 58f946072d282d843cd248c89aafe5cbfb62370d Mon Sep 17 00:00:00 2001 From: Gil Cukierman Date: Tue, 3 Jan 2023 18:21:34 +0000 Subject: [PATCH] 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 --- .../NullAlgorithmsPreferenceController.java | 27 +++++++++++++++++-- ...ullAlgorithmsPreferenceControllerTest.java | 19 +++++++++++++ 2 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/com/android/settings/network/telephony/NullAlgorithmsPreferenceController.java b/src/com/android/settings/network/telephony/NullAlgorithmsPreferenceController.java index c4fdcbddf6d..cfb5344bd54 100644 --- a/src/com/android/settings/network/telephony/NullAlgorithmsPreferenceController.java +++ b/src/com/android/settings/network/telephony/NullAlgorithmsPreferenceController.java @@ -69,6 +69,12 @@ public class NullAlgorithmsPreferenceController extends TelephonyTogglePreferenc } 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 @@ public class NullAlgorithmsPreferenceController extends TelephonyTogglePreferenc */ @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 @@ public class NullAlgorithmsPreferenceController extends TelephonyTogglePreferenc } 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 e57dfcdcd04..99d0a43562f 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.android.settings.core.BasePreferenceController.UNSUPPORTED_ON_ 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; @@ -119,6 +120,16 @@ public final class NullAlgorithmsPreferenceControllerTest { assertThat(mController.getAvailabilityStatus()).isEqualTo(CONDITIONALLY_UNAVAILABLE); } + @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, @@ -141,4 +152,12 @@ public final class NullAlgorithmsPreferenceControllerTest { 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); + } }