From 29cd7f19625a2a2a8528469e55f3aa495107b9e7 Mon Sep 17 00:00:00 2001 From: Dianne Hackborn Date: Thu, 8 Jan 2015 10:37:05 -0800 Subject: [PATCH] Fix issue #18827122: system server crashed on broadcasting... ...an intent with invalid or null package uri Also tweak battery stats to record in the history when we shut down, to understand when restarts are due to clean shutdowns or crashes. Change-Id: I6443dafc23e356be9f569906f6081152d4f92d2b --- core/java/android/os/BatteryStats.java | 9 ++++++++- .../com/android/internal/content/PackageMonitor.java | 5 +++-- .../com/android/internal/os/BatteryStatsImpl.java | 12 ++++++++++++ .../notification/NotificationManagerService.java | 3 +++ .../com/android/server/pm/UserManagerService.java | 3 +++ 5 files changed, 29 insertions(+), 3 deletions(-) diff --git a/core/java/android/os/BatteryStats.java b/core/java/android/os/BatteryStats.java index 5fd697a6b4a58..c0dca0e65d6ca 100644 --- a/core/java/android/os/BatteryStats.java +++ b/core/java/android/os/BatteryStats.java @@ -604,6 +604,7 @@ public abstract class BatteryStats implements Parcelable { public static final byte CMD_CURRENT_TIME = 5; public static final byte CMD_OVERFLOW = 6; public static final byte CMD_RESET = 7; + public static final byte CMD_SHUTDOWN = 8; public byte cmd = CMD_NULL; @@ -3529,6 +3530,11 @@ public abstract class BatteryStats implements Parcelable { pw.println(DateFormat.format("yyyy-MM-dd-HH-mm-ss", rec.currentTime).toString()); } + } else if (rec.cmd == HistoryItem.CMD_SHUTDOWN) { + if (checkin) { + pw.print(":"); + } + pw.println("SHUTDOWN"); } else if (rec.cmd == HistoryItem.CMD_OVERFLOW) { if (checkin) { pw.print(":"); @@ -3849,7 +3855,8 @@ public abstract class BatteryStats implements Parcelable { if (histStart >= 0 && !printed) { if (rec.cmd == HistoryItem.CMD_CURRENT_TIME || rec.cmd == HistoryItem.CMD_RESET - || rec.cmd == HistoryItem.CMD_START) { + || rec.cmd == HistoryItem.CMD_START + || rec.cmd == HistoryItem.CMD_SHUTDOWN) { printed = true; hprinter.printNextItem(pw, rec, baseTime, checkin, (flags&DUMP_VERBOSE) != 0); diff --git a/core/java/com/android/internal/content/PackageMonitor.java b/core/java/com/android/internal/content/PackageMonitor.java index 9df8ad5e6821d..eff44bd1c87fd 100644 --- a/core/java/com/android/internal/content/PackageMonitor.java +++ b/core/java/com/android/internal/content/PackageMonitor.java @@ -24,6 +24,7 @@ import android.net.Uri; import android.os.Handler; import android.os.Looper; import android.os.UserHandle; +import android.util.Slog; import com.android.internal.os.BackgroundThread; import java.util.HashSet; @@ -279,8 +280,8 @@ public abstract class PackageMonitor extends android.content.BroadcastReceiver { mChangeUserId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, UserHandle.USER_NULL); if (mChangeUserId == UserHandle.USER_NULL) { - throw new IllegalArgumentException( - "Intent broadcast does not contain user handle: " + intent); + Slog.w("PackageMonitor", "Intent broadcast does not contain user handle: " + intent); + return; } onBeginPackageChanges(); diff --git a/core/java/com/android/internal/os/BatteryStatsImpl.java b/core/java/com/android/internal/os/BatteryStatsImpl.java index 8ceee203a6dff..20bb95eeff4c6 100644 --- a/core/java/com/android/internal/os/BatteryStatsImpl.java +++ b/core/java/com/android/internal/os/BatteryStatsImpl.java @@ -6955,6 +6955,17 @@ public final class BatteryStatsImpl extends BatteryStats { } } + private void recordShutdownLocked(final long elapsedRealtimeMs, final long uptimeMs) { + if (mRecordingHistory) { + mHistoryCur.currentTime = System.currentTimeMillis(); + mLastRecordedClockTime = mHistoryCur.currentTime; + mLastRecordedClockRealtime = elapsedRealtimeMs; + addHistoryBufferLocked(elapsedRealtimeMs, uptimeMs, HistoryItem.CMD_SHUTDOWN, + mHistoryCur); + mHistoryCur.currentTime = 0; + } + } + // This should probably be exposed in the API, though it's not critical private static final int BATTERY_PLUGGED_NONE = 0; @@ -7627,6 +7638,7 @@ public final class BatteryStatsImpl extends BatteryStats { } public void shutdownLocked() { + recordShutdownLocked(SystemClock.elapsedRealtime(), SystemClock.uptimeMillis()); writeSyncLocked(); mShuttingDown = true; } diff --git a/services/core/java/com/android/server/notification/NotificationManagerService.java b/services/core/java/com/android/server/notification/NotificationManagerService.java index 960775548b706..02cacd9affb66 100644 --- a/services/core/java/com/android/server/notification/NotificationManagerService.java +++ b/services/core/java/com/android/server/notification/NotificationManagerService.java @@ -683,6 +683,9 @@ public class NotificationManagerService extends SystemService { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); + if (action == null) { + return; + } boolean queryRestart = false; boolean queryRemove = false; diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index be3251cab9dfc..d484b8f99c23c 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -320,6 +320,9 @@ public class UserManagerService extends IUserManager.Stub { checkManageUsersPermission("get the profile parent"); synchronized (mPackagesLock) { UserInfo profile = getUserInfoLocked(userHandle); + if (profile == null) { + return null; + } int parentUserId = profile.profileGroupId; if (parentUserId == UserInfo.NO_PROFILE_GROUP_ID) { return null;