From bc7a016b8ba511602d95611a6917478ee1b1eb54 Mon Sep 17 00:00:00 2001 From: Patrick Baumann Date: Tue, 23 Jun 2020 11:01:02 -0700 Subject: [PATCH] Fixes ordering on AppsFilter#removePackage Package remove was updating the forceQueryable state entirely too late in the removePackage method (before re-adding shared user packages still on device), resulting in the forceQueryable state being removed incorrectly. I've restructured the method to do all operations before adding shared user packages and the cache. Test: atest PublicApiAccessTest && atest DownloadProviderTests:PublicApiFunctionalTest && atest PublicApiAccessTest Fixes: 159654749 Change-Id: Ic7b0949eefdb5d55a874845d45f1940e733d6fdc --- .../com/android/server/pm/AppsFilter.java | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/services/core/java/com/android/server/pm/AppsFilter.java b/services/core/java/com/android/server/pm/AppsFilter.java index 8a7702efcba8a..d7c1605fffde8 100644 --- a/services/core/java/com/android/server/pm/AppsFilter.java +++ b/services/core/java/com/android/server/pm/AppsFilter.java @@ -782,7 +782,6 @@ public class AppsFilter { * @param setting the setting of the package being removed. */ public void removePackage(PackageSetting setting) { - removeAppIdFromVisibilityCache(setting.appId); mStateProvider.runWithState((settings, users) -> { final int userCount = users.length; for (int u = 0; u < userCount; u++) { @@ -805,17 +804,7 @@ public class AppsFilter { mQueriesViaPackage.remove(mQueriesViaPackage.keyAt(i), setting.appId); } - // re-add other shared user members to re-establish visibility between them and other - // packages - if (setting.sharedUser != null) { - for (int i = setting.sharedUser.packages.size() - 1; i >= 0; i--) { - if (setting.sharedUser.packages.valueAt(i) == setting) { - continue; - } - addPackageInternal( - setting.sharedUser.packages.valueAt(i), settings); - } - } + mForceQueryable.remove(setting.appId); if (setting.pkg != null && !setting.pkg.getProtectedBroadcasts().isEmpty()) { final String removingPackageName = setting.pkg.getPackageName(); @@ -829,6 +818,21 @@ public class AppsFilter { mOverlayReferenceMapper.removePkg(setting.name); mFeatureConfig.updatePackageState(setting, true /*removed*/); + // After removing all traces of the package, if it's part of a shared user, re-add other + // shared user members to re-establish visibility between them and other packages. + // NOTE: this must come after all removals from data structures but before we update the + // cache + if (setting.sharedUser != null) { + for (int i = setting.sharedUser.packages.size() - 1; i >= 0; i--) { + if (setting.sharedUser.packages.valueAt(i) == setting) { + continue; + } + addPackageInternal( + setting.sharedUser.packages.valueAt(i), settings); + } + } + + removeAppIdFromVisibilityCache(setting.appId); if (mShouldFilterCache != null && setting.sharedUser != null) { for (int i = setting.sharedUser.packages.size() - 1; i >= 0; i--) { PackageSetting siblingSetting = setting.sharedUser.packages.valueAt(i); @@ -840,9 +844,6 @@ public class AppsFilter { } } }); - mForceQueryable.remove(setting.appId); - - } /**