From c8c2c0d005a1e099f28dfa96339f3ecaf9b6fc70 Mon Sep 17 00:00:00 2001 From: Kurt Dresner Date: Tue, 14 Sep 2021 22:19:44 +0000 Subject: [PATCH] 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 --- .../core/java/com/android/server/UiModeManagerService.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/UiModeManagerService.java b/services/core/java/com/android/server/UiModeManagerService.java index 10071309bc0d3..81627a05c9a40 100644 --- a/services/core/java/com/android/server/UiModeManagerService.java +++ b/services/core/java/com/android/server/UiModeManagerService.java @@ -1167,11 +1167,16 @@ final class UiModeManagerService extends SystemService { } 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); } }