Clear binder identity before dispatching ap op mode changes.
bug:21078841
Change-Id: I409b739bbda10542142c8aac1522ad49882f5ec5
diff --git a/services/core/java/com/android/server/AppOpsService.java b/services/core/java/com/android/server/AppOpsService.java
index 7d427d6..79c66b9 100644
--- a/services/core/java/com/android/server/AppOpsService.java
+++ b/services/core/java/com/android/server/AppOpsService.java
@@ -408,11 +408,19 @@
}
}
if (repCbs != null) {
- for (int i=0; i<repCbs.size(); i++) {
- try {
- repCbs.get(i).mCallback.opChanged(code, packageName);
- } catch (RemoteException e) {
+ // There are components watching for mode changes such as window manager
+ // and location manager which are in our process. The callbacks in these
+ // components may require permissions our remote caller does not have.
+ final long identity = Binder.clearCallingIdentity();
+ try {
+ for (int i = 0; i < repCbs.size(); i++) {
+ try {
+ repCbs.get(i).mCallback.opChanged(code, packageName);
+ } catch (RemoteException e) {
+ }
}
+ } finally {
+ Binder.restoreCallingIdentity(identity);
}
}
}