From 47f5c9c55f791fad17c1d49703811602c75a02b6 Mon Sep 17 00:00:00 2001 From: Annie Meng Date: Tue, 27 Feb 2018 14:48:21 +0000 Subject: [PATCH] Validate restore of NetworkPolicy settings We want to catch potential exceptions that occur when restoring NetworkPolicy settings. Here, a DateTimeException can be thrown when we try to read the recurrence rule from the backup data and cannot parse a timezone. We also add GTS tests to validate that these catches persist and that we don't crash when given unexpected backup data to restore. Bug: 73942796 Test: gts-tradefed run gts -m GtsBackupHostTestCases -t com.google.android.gts.backup.NetworkPolicyRestoreHostSideTest Change-Id: I6f6ea09d2fff60b8d704c6160234e6f032321103 (cherry picked from commit 853097ca2c29d9bb708b6f600a7d46f2a2a77289) --- core/java/android/net/NetworkPolicy.java | 2 +- core/java/android/util/RecurrenceRule.java | 1 + .../com/android/providers/settings/SettingsBackupAgent.java | 6 +++--- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/core/java/android/net/NetworkPolicy.java b/core/java/android/net/NetworkPolicy.java index 9f47f62775e18..1a28732e874e2 100644 --- a/core/java/android/net/NetworkPolicy.java +++ b/core/java/android/net/NetworkPolicy.java @@ -257,7 +257,7 @@ public class NetworkPolicy implements Parcelable, Comparable { public static NetworkPolicy getNetworkPolicyFromBackup(DataInputStream in) throws IOException, BackupUtils.BadVersionException { final int version = in.readInt(); - if (version > VERSION_RAPID) { + if (version < VERSION_INIT || version > VERSION_RAPID) { throw new BackupUtils.BadVersionException("Unknown backup version: " + version); } diff --git a/core/java/android/util/RecurrenceRule.java b/core/java/android/util/RecurrenceRule.java index cd8b097cd2f19..9f115eba442cd 100644 --- a/core/java/android/util/RecurrenceRule.java +++ b/core/java/android/util/RecurrenceRule.java @@ -99,6 +99,7 @@ public class RecurrenceRule implements Parcelable { start = convertZonedDateTime(BackupUtils.readString(in)); end = convertZonedDateTime(BackupUtils.readString(in)); period = convertPeriod(BackupUtils.readString(in)); + break; default: throw new ProtocolException("Unknown version " + version); } diff --git a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java index 2b181dcfd25e7..313f73f8d6345 100644 --- a/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java +++ b/packages/SettingsProvider/src/com/android/providers/settings/SettingsBackupAgent.java @@ -49,12 +49,11 @@ import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.EOFException; -import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; +import java.time.DateTimeException; import java.util.Arrays; -import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.zip.CRC32; @@ -913,7 +912,8 @@ public class SettingsBackupAgent extends BackupAgentHelper { } // Only set the policies if there was no error in the restore operation networkPolicyManager.setNetworkPolicies(policies); - } catch (NullPointerException | IOException | BackupUtils.BadVersionException e) { + } catch (NullPointerException | IOException | BackupUtils.BadVersionException + | DateTimeException e) { // NPE can be thrown when trying to instantiate a NetworkPolicy Log.e(TAG, "Failed to convert byte array to NetworkPolicies " + e.getMessage()); }