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()