diff options
| author | 2010-08-05 12:08:25 -0700 | |
|---|---|---|
| committer | 2010-08-05 12:08:25 -0700 | |
| commit | b5c22f723628c31f82fa4b77fdb4451cfadd58ec (patch) | |
| tree | 12f2fa87bdec63a0dbbb262c87feaaa7c87b2608 | |
| parent | fa537bd4a03abed3489f7b30eb76b43638815257 (diff) | |
| parent | 811d66f1496b64b02c117e8d992db99e9e6cdc8d (diff) | |
am 811d66f1: am 9b87770f: Merge "Fix crash when startForeground posts a broken Notification." into gingerbread
Merge commit '811d66f1496b64b02c117e8d992db99e9e6cdc8d'
* commit '811d66f1496b64b02c117e8d992db99e9e6cdc8d':
Fix crash when startForeground posts a broken Notification.
3 files changed, 26 insertions, 11 deletions
diff --git a/core/java/android/app/NotificationManager.java b/core/java/android/app/NotificationManager.java index 6fe12fcf0bda..1fae516b060f 100644 --- a/core/java/android/app/NotificationManager.java +++ b/core/java/android/app/NotificationManager.java @@ -17,6 +17,7 @@ package android.app; import android.content.Context; +import android.os.Binder; import android.os.RemoteException; import android.os.Handler; import android.os.IBinder; diff --git a/services/java/com/android/server/NotificationManagerService.java b/services/java/com/android/server/NotificationManagerService.java index 4f11231d4978..67796c6188de 100755 --- a/services/java/com/android/server/NotificationManagerService.java +++ b/services/java/com/android/server/NotificationManagerService.java @@ -68,7 +68,8 @@ import java.io.PrintWriter; import java.util.ArrayList; import java.util.Arrays; -class NotificationManagerService extends INotificationManager.Stub +/** {@hide} */ +public class NotificationManagerService extends INotificationManager.Stub { private static final String TAG = "NotificationService"; private static final boolean DBG = false; @@ -316,7 +317,8 @@ class NotificationManagerService extends INotificationManager.Stub public void onNotificationError(String pkg, String tag, int id, int uid, int initialPid, String message) { - Slog.d(TAG, "onNotification error pkg=" + pkg + " tag=" + tag + " id=" + id); + Slog.d(TAG, "onNotification error pkg=" + pkg + " tag=" + tag + " id=" + id + + "; will crashApplication(uid=" + uid + ", pid=" + initialPid + ")"); cancelNotification(pkg, tag, id, 0, 0); long ident = Binder.clearCallingIdentity(); try { @@ -671,11 +673,20 @@ class NotificationManagerService extends INotificationManager.Stub enqueueNotificationWithTag(pkg, null /* tag */, id, notification, idOut); } - public void enqueueNotificationWithTag(String pkg, String tag, int id, - Notification notification, int[] idOut) + public void enqueueNotificationWithTag(String pkg, String tag, int id, Notification notification, + int[] idOut) { - final int callingUid = Binder.getCallingUid(); - final int callingPid = Binder.getCallingPid(); + enqueueNotificationInternal(pkg, Binder.getCallingUid(), Binder.getCallingPid(), + tag, id, notification, idOut); + } + + // Not exposed via Binder; for system use only (otherwise malicious apps could spoof the + // uid/pid of another application) + public void enqueueNotificationInternal(String pkg, int callingUid, int callingPid, + String tag, int id, Notification notification, int[] idOut) + { + Slog.d(TAG, "enqueueNotificationWithTag: calling uid=" + callingUid + + ", pid=" + callingPid); checkIncomingCall(pkg); diff --git a/services/java/com/android/server/am/ServiceRecord.java b/services/java/com/android/server/am/ServiceRecord.java index 05424973c86a..75365ad90c8d 100644 --- a/services/java/com/android/server/am/ServiceRecord.java +++ b/services/java/com/android/server/am/ServiceRecord.java @@ -17,6 +17,7 @@ package com.android.server.am; import com.android.internal.os.BatteryStatsImpl; +import com.android.server.NotificationManagerService; import android.app.INotificationManager; import android.app.Notification; @@ -252,6 +253,8 @@ class ServiceRecord extends Binder { } public void postNotification() { + final int appUid = appInfo.uid; + final int appPid = app.pid; if (foregroundId != 0 && foregroundNoti != null) { // Do asynchronous communication with notification manager to // avoid deadlocks. @@ -260,14 +263,15 @@ class ServiceRecord extends Binder { final Notification localForegroundNoti = foregroundNoti; ams.mHandler.post(new Runnable() { public void run() { - INotificationManager inm = NotificationManager.getService(); - if (inm == null) { + NotificationManagerService nm = + (NotificationManagerService) NotificationManager.getService(); + if (nm == null) { return; } try { int[] outId = new int[1]; - inm.enqueueNotification(localPackageName, localForegroundId, - localForegroundNoti, outId); + nm.enqueueNotificationInternal(localPackageName, appUid, appPid, + null, localForegroundId, localForegroundNoti, outId); } catch (RuntimeException e) { Slog.w(ActivityManagerService.TAG, "Error showing notification for service", e); @@ -275,7 +279,6 @@ class ServiceRecord extends Binder { // get to be foreground. ams.setServiceForeground(name, ServiceRecord.this, localForegroundId, null, true); - } catch (RemoteException e) { } } }); |