Clear caller identity in doesPackageHaveCallingUid helper method so it can work across users.
When this helper method is called on a binder thread it checks the caller's permission instead of just using the system service privileges to make the call, resulting in erroneous SecurityExceptions.
Bug: 182832208
Bug: 198860541
Test: CTS/unit tests
Change-Id: I2c71109f2556a47b8e44150565800528496173f5
diff --git a/services/core/java/com/android/server/UiModeManagerService.java b/services/core/java/com/android/server/UiModeManagerService.java
index 1007130..81627a0 100644
--- a/services/core/java/com/android/server/UiModeManagerService.java
+++ b/services/core/java/com/android/server/UiModeManagerService.java
@@ -1167,11 +1167,16 @@
}
private boolean doesPackageHaveCallingUid(@NonNull String packageName) {
+ int callingUid = mInjector.getCallingUid();
+ int callingUserId = UserHandle.getUserId(callingUid);
+ final long ident = Binder.clearCallingIdentity();
try {
return getContext().getPackageManager().getPackageUidAsUser(packageName,
- UserHandle.getCallingUserId()) == mInjector.getCallingUid();
+ callingUserId) == callingUid;
} catch (PackageManager.NameNotFoundException e) {
return false;
+ } finally {
+ Binder.restoreCallingIdentity(ident);
}
}