summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Daniel Sandler <dsandler@android.com> 2010-08-05 12:08:25 -0700
committer Android Git Automerger <android-git-automerger@android.com> 2010-08-05 12:08:25 -0700
commitb5c22f723628c31f82fa4b77fdb4451cfadd58ec (patch)
tree12f2fa87bdec63a0dbbb262c87feaaa7c87b2608
parentfa537bd4a03abed3489f7b30eb76b43638815257 (diff)
parent811d66f1496b64b02c117e8d992db99e9e6cdc8d (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.
-rw-r--r--core/java/android/app/NotificationManager.java1
-rwxr-xr-xservices/java/com/android/server/NotificationManagerService.java23
-rw-r--r--services/java/com/android/server/am/ServiceRecord.java13
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) {
}
}
});