From 88c11506df66e1f08d241880281b1a0a3b320a91 Mon Sep 17 00:00:00 2001 From: Patrick Baumann Date: Tue, 23 Jun 2020 13:07:55 -0700 Subject: [PATCH] Remove then add during replace to reset vis This change adds a special case to remove a package from the apps filter just before adding it during a replace action to ensure we wipe any no-longer-valid visibility grants. This was broken when we moved the removePackage call to account for packages that are removed with KEEP_DATA set. To account for both scenarios, we added make an additional call for the replace case. Fixes: 159732800 Test: atest AppEnumerationTests Change-Id: I031c634986b0666163f0292070be31c33461b9bc --- .../java/com/android/server/pm/AppsFilter.java | 16 +++++++++++++++- .../android/server/pm/PackageManagerService.java | 4 +++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/pm/AppsFilter.java b/services/core/java/com/android/server/pm/AppsFilter.java index 9203122617101..35a9c6ee9fa76 100644 --- a/services/core/java/com/android/server/pm/AppsFilter.java +++ b/services/core/java/com/android/server/pm/AppsFilter.java @@ -495,10 +495,15 @@ public class AppsFilter { * Adds a package that should be considered when filtering visibility between apps. * * @param newPkgSetting the new setting being added + * @param isReplace if the package is being replaced and may need extra cleanup. */ - public void addPackage(PackageSetting newPkgSetting) { + public void addPackage(PackageSetting newPkgSetting, boolean isReplace) { Trace.traceBegin(TRACE_TAG_PACKAGE_MANAGER, "filter.addPackage"); try { + if (isReplace) { + // let's first remove any prior rules for this package + removePackage(newPkgSetting); + } mStateProvider.runWithState((settings, users) -> { addPackageInternal(newPkgSetting, settings); if (mShouldFilterCache != null) { @@ -776,6 +781,15 @@ public class AppsFilter { return result; } + /** + * Equivalent to calling {@link #addPackage(PackageSetting, boolean)} with {@code isReplace} + * equal to {@code false}. + * @see AppsFilter#addPackage(PackageSetting, boolean) + */ + public void addPackage(PackageSetting newPkgSetting) { + addPackage(newPkgSetting, false /* isReplace */); + } + /** * Removes a package for consideration when filtering visibility between apps. * diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index 13145d00274f8..84641bce474f3 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -12366,7 +12366,9 @@ public class PackageManagerService extends IPackageManager.Stub ksms.addScannedPackageLPw(pkg); mComponentResolver.addAllComponents(pkg, chatty); - mAppsFilter.addPackage(pkgSetting); + final boolean isReplace = + reconciledPkg.prepareResult != null && reconciledPkg.prepareResult.replace; + mAppsFilter.addPackage(pkgSetting, isReplace); // Don't allow ephemeral applications to define new permissions groups. if ((scanFlags & SCAN_AS_INSTANT_APP) != 0) {