From 26fe60a1887aa55a8ecb6c8196894c7348efeae7 Mon Sep 17 00:00:00 2001 From: Neil Fuller Date: Mon, 11 May 2020 19:05:52 +0100 Subject: Be more defensive around invalid tzids Add checks during boot in case the persist.sys.timezone property is set to a bad ID. This can happen in the rare case of a mainline rollback: i.e. if a device has been set to a new ID and then the update is rolled back. Using GMT as a fallback probably works without this change (it does in java.util.TimeZone), but relies on all code, including native code that uses persist.sys.timezone directly, knowing to interpret a bad ID as "GMT". This commit makes that choice more explicit and defensive. This change also removes the possibility of IOException, which is never thrown, from some ZoneInfoDb methods. Bug: 155738410 Test: boot with a valid id, verify persist.sys.timezone is unchanged Test: boot with an invalid id set, verify persist.sys.timezone is "GMT" Merged-In: I6dc0f4f81848efbbaec6a11a62014471a0ef01fd Change-Id: I6dc0f4f81848efbbaec6a11a62014471a0ef01fd Exempt-From-Owner-Approval: Approved / landed internally --- services/java/com/android/server/SystemServer.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) (limited to 'services/java') diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 0167a3b0aebe..23b1512081da 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -165,6 +165,8 @@ import com.android.server.wm.ActivityTaskManagerService; import com.android.server.wm.WindowManagerGlobalLock; import com.android.server.wm.WindowManagerService; +import libcore.timezone.ZoneInfoDb; + import dalvik.system.VMRuntime; import java.io.File; @@ -395,8 +397,9 @@ public final class SystemServer { // Default the timezone property to GMT if not set. // String timezoneProperty = SystemProperties.get("persist.sys.timezone"); - if (timezoneProperty == null || timezoneProperty.isEmpty()) { - Slog.w(TAG, "Timezone not set; setting to GMT."); + if (!isValidTimeZoneId(timezoneProperty)) { + Slog.w(TAG, "persist.sys.timezone is not valid (" + timezoneProperty + + "); setting to GMT."); SystemProperties.set("persist.sys.timezone", "GMT"); } @@ -564,6 +567,12 @@ public final class SystemServer { throw new RuntimeException("Main thread loop unexpectedly exited"); } + private static boolean isValidTimeZoneId(String timezoneProperty) { + return timezoneProperty != null + && !timezoneProperty.isEmpty() + && ZoneInfoDb.getInstance().hasTimeZone(timezoneProperty); + } + private boolean isFirstBootOrUpgrade() { return mPackageManagerService.isFirstBoot() || mPackageManagerService.isDeviceUpgrading(); } -- cgit v1.2.3-59-g8ed1b