summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/pm/PackageManagerService.java80
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)) {