From 3ecbba22d8bb550a10d785e9928e1329f40c6f38 Mon Sep 17 00:00:00 2001 From: Hai Zhang Date: Thu, 23 Feb 2023 09:38:01 +0000 Subject: [PATCH] Fix multi-user handling in PermissionPolicyService. PackageListObserver is actually only called once with an app ID, instead of for each user with a UID. This is a modified version of pa/2393586, with fixes for package change and removal callbacks as well. Bug: 221911904 Test: presubmit Change-Id: I390e1493193651689c5fa37e2b2ebe9d7aabaf80 --- .../policy/PermissionPolicyService.java | 37 ++++++++++++------- 1 file changed, 24 insertions(+), 13 deletions(-) diff --git a/services/core/java/com/android/server/policy/PermissionPolicyService.java b/services/core/java/com/android/server/policy/PermissionPolicyService.java index db44e1414ca76..0e99e7ee1daab 100644 --- a/services/core/java/com/android/server/policy/PermissionPolicyService.java +++ b/services/core/java/com/android/server/policy/PermissionPolicyService.java @@ -194,27 +194,38 @@ public final class PermissionPolicyService extends SystemService { mPackageManagerInternal.getPackageList(new PackageListObserver() { @Override - public void onPackageAdded(String packageName, int uid) { - final int userId = UserHandle.getUserId(uid); - if (isStarted(userId)) { - synchronizePackagePermissionsAndAppOpsForUser(packageName, userId); + public void onPackageAdded(String packageName, int appId) { + final int[] userIds = LocalServices.getService(UserManagerInternal.class) + .getUserIds(); + for (final int userId : userIds) { + if (isStarted(userId)) { + synchronizePackagePermissionsAndAppOpsForUser(packageName, userId); + } } } @Override - public void onPackageChanged(String packageName, int uid) { - final int userId = UserHandle.getUserId(uid); - if (isStarted(userId)) { - synchronizePackagePermissionsAndAppOpsForUser(packageName, userId); - resetAppOpPermissionsIfNotRequestedForUid(uid); + public void onPackageChanged(String packageName, int appId) { + final int[] userIds = LocalServices.getService(UserManagerInternal.class) + .getUserIds(); + for (final int userId : userIds) { + if (isStarted(userId)) { + synchronizePackagePermissionsAndAppOpsForUser(packageName, userId); + final int uid = UserHandle.getUid(userId, appId); + resetAppOpPermissionsIfNotRequestedForUid(uid); + } } } @Override - public void onPackageRemoved(String packageName, int uid) { - final int userId = UserHandle.getUserId(uid); - if (isStarted(userId)) { - resetAppOpPermissionsIfNotRequestedForUid(uid); + public void onPackageRemoved(String packageName, int appId) { + final int[] userIds = LocalServices.getService(UserManagerInternal.class) + .getUserIds(); + for (final int userId : userIds) { + if (isStarted(userId)) { + final int uid = UserHandle.getUid(userId, appId); + resetAppOpPermissionsIfNotRequestedForUid(uid); + } } } });