From cc3c2d99a4e532b0a54662b83346fb11017656cf Mon Sep 17 00:00:00 2001 From: kholoud mohamed Date: Wed, 5 May 2021 17:17:10 +0100 Subject: [PATCH] Fix bug in CrossProfileApps#canInteractAcrossProfiles Changed canInteractAcrossProfiles to check that all other profiles have the appop enabled to return true, previously it only checked the appop for the calling uid, which should theoretically be always in sync with the other profiles, but we got a bug were it wasn't in sync for an unidentified reason. Test: atest com.android.cts.devicepolicy.CrossProfileAppsPermissionHostSideTest Bug: 182396357 Bug: 183188804 Change-Id: Ied170ee87358ffa248bf4315d93a736f7307a3b2 --- .../pm/CrossProfileAppsServiceImpl.java | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/pm/CrossProfileAppsServiceImpl.java b/services/core/java/com/android/server/pm/CrossProfileAppsServiceImpl.java index 1d73abc466ada..8fc5fbe752b6c 100644 --- a/services/core/java/com/android/server/pm/CrossProfileAppsServiceImpl.java +++ b/services/core/java/com/android/server/pm/CrossProfileAppsServiceImpl.java @@ -288,7 +288,9 @@ public class CrossProfileAppsServiceImpl extends ICrossProfileApps.Stub { if (targetUserProfiles.isEmpty()) { return false; } - return hasCallerGotInteractAcrossProfilesPermission(callingPackage); + return hasCallerGotInteractAcrossProfilesPermission(callingPackage) + && haveProfilesGotInteractAcrossProfilesPermission( + callingPackage, targetUserProfiles); } private boolean hasCallerGotInteractAcrossProfilesPermission(String callingPackage) { @@ -296,6 +298,28 @@ public class CrossProfileAppsServiceImpl extends ICrossProfileApps.Stub { callingPackage, mInjector.getCallingUid(), mInjector.getCallingPid()); } + private boolean haveProfilesGotInteractAcrossProfilesPermission( + String packageName, List profiles) { + for (UserHandle profile : profiles) { + final int uid = mInjector.withCleanCallingIdentity(() -> { + try { + return mInjector.getPackageManager().getPackageUidAsUser( + packageName, /* flags= */ 0, profile.getIdentifier()); + } catch (PackageManager.NameNotFoundException e) { + return -1; + } + }); + if (uid == -1) { + return false; + } + if (!hasInteractAcrossProfilesPermission( + packageName, uid, PermissionChecker.PID_UNKNOWN)) { + return false; + } + } + return true; + } + private boolean isCrossProfilePackageAllowlisted(String packageName) { return mInjector.withCleanCallingIdentity(() -> mInjector.getDevicePolicyManagerInternal()