From d2f1511f2896e09db35bd92e0aab02ba89888a04 Mon Sep 17 00:00:00 2001 From: Todd Kennedy Date: Wed, 21 Jan 2015 15:25:56 -0800 Subject: [PATCH] Don't get extras from the Intent When handling Intents in the system process, we need to be careful to not cause the extras bundle to be unparcelled. If the extra is unparcelled, any custom class added to the extras will throw a ClassCastException during the unparcel. For legacy reasons, we would get the "seq" extra from the Intent for broadcast debugging. This violates our requirement to not unparcel extras in the system server process. Bug: 19068243 Change-Id: I6cac426a0ef8648a05ded69ee4ac244017d9b5d1 --- .../android/server/am/ActivityManagerService.java | 15 +++++++-------- .../com/android/server/am/BroadcastQueue.java | 15 ++++----------- 2 files changed, 11 insertions(+), 19 deletions(-) diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index a2f5c15fa94b7..f56499998334d 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -7051,7 +7051,6 @@ public final class ActivityManagerService extends ActivityManagerNative return; } - final IPackageManager pm = AppGlobals.getPackageManager(); final String authority = uri.getAuthority(); final ProviderInfo pi = getProviderInfoLocked(authority, userId); if (pi == null) { @@ -15733,14 +15732,14 @@ public final class ActivityManagerService extends ActivityManagerNative callerPackage, callingPid, callingUid, resolvedType, requiredPermission, appOp, receivers, resultTo, resultCode, resultData, map, ordered, sticky, false, userId); + if (DEBUG_BROADCAST) Slog.v( TAG, "Enqueueing ordered broadcast " + r + ": prev had " + queue.mOrderedBroadcasts.size()); - if (DEBUG_BROADCAST) { - int seq = r.intent.getIntExtra("seq", -1); - Slog.i(TAG, "Enqueueing broadcast " + r.intent.getAction() + " seq=" + seq); - } - boolean replaced = replacePending && queue.replaceOrderedBroadcastLocked(r); + if (DEBUG_BROADCAST) Slog.i( + TAG, "Enqueueing broadcast " + r.intent.getAction()); + + boolean replaced = replacePending && queue.replaceOrderedBroadcastLocked(r); if (!replaced) { queue.enqueueOrderedBroadcastLocked(r); queue.scheduleBroadcastsLocked(); @@ -18289,8 +18288,8 @@ public final class ActivityManagerService extends ActivityManagerNative } } - private Set getProfileIdsLocked(int userId) { - Set userIds = new HashSet(); + private Set getProfileIdsLocked(int userId) { + Set userIds = new HashSet(); final List profiles = getUserManagerLocked().getProfiles( userId, false /* enabledOnly */); for (UserInfo user : profiles) { diff --git a/services/core/java/com/android/server/am/BroadcastQueue.java b/services/core/java/com/android/server/am/BroadcastQueue.java index 9b7d0b2eb293d..7ab3794871176 100644 --- a/services/core/java/com/android/server/am/BroadcastQueue.java +++ b/services/core/java/com/android/server/am/BroadcastQueue.java @@ -513,11 +513,7 @@ public final class BroadcastQueue { } } try { - if (DEBUG_BROADCAST_LIGHT) { - int seq = r.intent.getIntExtra("seq", -1); - Slog.i(TAG, "Delivering to " + filter - + " (seq=" + seq + "): " + r); - } + if (DEBUG_BROADCAST_LIGHT) Slog.i(TAG, "Delivering to " + filter + " : " + r); performReceiveLocked(filter.receiverList.app, filter.receiverList.receiver, new Intent(r.intent), r.resultCode, r.resultData, r.resultExtras, r.ordered, r.initialSticky, r.userId); @@ -662,12 +658,9 @@ public final class BroadcastQueue { // result if requested... if (r.resultTo != null) { try { - if (DEBUG_BROADCAST) { - int seq = r.intent.getIntExtra("seq", -1); - Slog.i(TAG, "Finishing broadcast [" - + mQueueName + "] " + r.intent.getAction() - + " seq=" + seq + " app=" + r.callerApp); - } + if (DEBUG_BROADCAST) Slog.i(TAG, + "Finishing broadcast [" + mQueueName + "] " + + r.intent.getAction() + " app=" + r.callerApp); performReceiveLocked(r.callerApp, r.resultTo, new Intent(r.intent), r.resultCode, r.resultData, r.resultExtras, false, false, r.userId);