diff options
| -rw-r--r-- | services/core/java/com/android/server/pm/PackageManagerService.java | 80 |
1 files changed, 57 insertions, 23 deletions
diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 36843d4a9a0f..16069386b575 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -6833,12 +6833,16 @@ public class PackageManagerService extends IPackageManager.Stub final boolean isTargetHiddenFromInstantApp = !isTargetVisibleToInstantApp || (matchExplicitlyVisibleOnly && !isTargetExplicitlyVisibleToInstantApp); - final boolean blockResolution = + final boolean blockInstantResolution = !isTargetSameInstantApp && ((!matchInstantApp && !isCallerInstantApp && isTargetInstantApp) || (matchVisibleToInstantAppOnly && isCallerInstantApp && isTargetHiddenFromInstantApp)); - if (!blockResolution) { + final boolean blockNormalResolution = !isTargetInstantApp && !isCallerInstantApp + && !resolveForStart && shouldFilterApplicationLocked( + getPackageSettingInternal(ai.applicationInfo.packageName, + Process.SYSTEM_UID), filterCallingUid, userId); + if (!blockInstantResolution && !blockNormalResolution) { final ResolveInfo ri = new ResolveInfo(); ri.activityInfo = ai; list.add(ri); @@ -7222,9 +7226,17 @@ public class PackageManagerService extends IPackageManager.Stub resolveInfos.set(i, installerInfo); continue; } - // caller is a full app, don't need to apply any other filtering + // caller is a full app if (ephemeralPkgName == null) { - continue; + SettingBase callingSetting = + mSettings.getSettingLPr(UserHandle.getAppId(filterCallingUid)); + PackageSetting resolvedSetting = + getPackageSettingInternal(info.activityInfo.packageName, 0); + if (resolveForStart + || !mAppsFilter.shouldFilterApplication( + filterCallingUid, callingSetting, resolvedSetting, userId)) { + continue; + } } else if (ephemeralPkgName.equals(info.activityInfo.packageName)) { // caller is same app; don't need to apply any other filtering continue; @@ -7914,12 +7926,17 @@ public class PackageManagerService extends IPackageManager.Stub & ApplicationInfo.PRIVATE_FLAG_INSTANT) != 0; final boolean isTargetHiddenFromInstantApp = (si.flags & ServiceInfo.FLAG_VISIBLE_TO_INSTANT_APP) == 0; - final boolean blockResolution = + final boolean blockInstantResolution = !isTargetSameInstantApp && ((!matchInstantApp && !isCallerInstantApp && isTargetInstantApp) || (matchVisibleToInstantAppOnly && isCallerInstantApp && isTargetHiddenFromInstantApp)); - if (!blockResolution) { + + final boolean blockNormalResolution = !isTargetInstantApp && !isCallerInstantApp + && shouldFilterApplicationLocked( + getPackageSettingInternal(si.applicationInfo.packageName, + Process.SYSTEM_UID), callingUid, userId); + if (!blockInstantResolution && !blockNormalResolution) { final ResolveInfo ri = new ResolveInfo(); ri.serviceInfo = si; list.add(ri); @@ -7938,8 +7955,7 @@ public class PackageManagerService extends IPackageManager.Stub return Collections.emptyList(); } return applyPostServiceResolutionFilter( - resolveInfos, - instantAppPkgName); + resolveInfos, instantAppPkgName, userId, callingUid); } final AndroidPackage pkg = mPackages.get(pkgName); if (pkg != null) { @@ -7950,20 +7966,26 @@ public class PackageManagerService extends IPackageManager.Stub return Collections.emptyList(); } return applyPostServiceResolutionFilter( - resolveInfos, - instantAppPkgName); + resolveInfos, instantAppPkgName, userId, callingUid); } return Collections.emptyList(); } } private List<ResolveInfo> applyPostServiceResolutionFilter(List<ResolveInfo> resolveInfos, - String instantAppPkgName) { - if (instantAppPkgName == null) { - return resolveInfos; - } + String instantAppPkgName, @UserIdInt int userId, int filterCallingUid) { for (int i = resolveInfos.size() - 1; i >= 0; i--) { final ResolveInfo info = resolveInfos.get(i); + if (instantAppPkgName == null) { + SettingBase callingSetting = + mSettings.getSettingLPr(UserHandle.getAppId(filterCallingUid)); + PackageSetting resolvedSetting = + getPackageSettingInternal(info.serviceInfo.packageName, 0); + if (!mAppsFilter.shouldFilterApplication( + filterCallingUid, callingSetting, resolvedSetting, userId)) { + continue; + } + } final boolean isEphemeralApp = info.serviceInfo.applicationInfo.isInstantApp(); // allow services that are defined in the provided package if (isEphemeralApp && instantAppPkgName.equals(info.serviceInfo.packageName)) { @@ -8046,7 +8068,11 @@ public class PackageManagerService extends IPackageManager.Stub && ((!matchInstantApp && !isCallerInstantApp && isTargetInstantApp) || (matchVisibleToInstantAppOnly && isCallerInstantApp && isTargetHiddenFromInstantApp)); - if (!blockResolution) { + final boolean blockNormalResolution = !isTargetInstantApp && !isCallerInstantApp + && shouldFilterApplicationLocked( + getPackageSettingInternal(pi.applicationInfo.packageName, + Process.SYSTEM_UID), callingUid, userId); + if (!blockResolution && !blockNormalResolution) { final ResolveInfo ri = new ResolveInfo(); ri.providerInfo = pi; list.add(ri); @@ -8065,8 +8091,7 @@ public class PackageManagerService extends IPackageManager.Stub return Collections.emptyList(); } return applyPostContentProviderResolutionFilter( - resolveInfos, - instantAppPkgName); + resolveInfos, instantAppPkgName, userId, callingUid); } final AndroidPackage pkg = mPackages.get(pkgName); if (pkg != null) { @@ -8077,20 +8102,29 @@ public class PackageManagerService extends IPackageManager.Stub return Collections.emptyList(); } return applyPostContentProviderResolutionFilter( - resolveInfos, - instantAppPkgName); + resolveInfos, instantAppPkgName, userId, callingUid); } return Collections.emptyList(); } } private List<ResolveInfo> applyPostContentProviderResolutionFilter( - List<ResolveInfo> resolveInfos, String instantAppPkgName) { - if (instantAppPkgName == null) { - return resolveInfos; - } + List<ResolveInfo> resolveInfos, String instantAppPkgName, + @UserIdInt int userId, int callingUid) { for (int i = resolveInfos.size() - 1; i >= 0; i--) { final ResolveInfo info = resolveInfos.get(i); + + if (instantAppPkgName == null) { + SettingBase callingSetting = + mSettings.getSettingLPr(UserHandle.getAppId(callingUid)); + PackageSetting resolvedSetting = + getPackageSettingInternal(info.providerInfo.packageName, 0); + if (!mAppsFilter.shouldFilterApplication( + callingUid, callingSetting, resolvedSetting, userId)) { + continue; + } + } + final boolean isEphemeralApp = info.providerInfo.applicationInfo.isInstantApp(); // allow providers that are defined in the provided package if (isEphemeralApp && instantAppPkgName.equals(info.providerInfo.packageName)) { |