From b2fafea71b6d48ab441da56e5d2e0c3fdd68d682 Mon Sep 17 00:00:00 2001 From: bkchoi Date: Mon, 11 Jul 2022 13:19:05 -0700 Subject: [PATCH] Fix a bug in UserSystemPackageInstaller#installWhitelistedSystemPackages When userWhitelist was not null, it only mutated the packages in userWhitelist, and other packages left untouched. The correct behavior is to iterate all packages and install or uninstall according to userWhitelist. BYPASS_INCLUSIVE_LANGUAGE_REASON=existing code that cannot be changed Fixes: 234877652 Test: atest UserSystemPackageInstallerTest Test: Manual test with gcar_emu_x86_64 emulator (cherry picked from commit 2fce0901463af17ebfdb557d01b41cc5e4e97ecf) Merged-In: I4325565d8acaeffd4aab5a4b6295d325edb738a9 Change-Id: I4325565d8acaeffd4aab5a4b6295d325edb738a9 --- .../server/pm/UserSystemPackageInstaller.java | 43 ++++++------------- 1 file changed, 13 insertions(+), 30 deletions(-) diff --git a/services/core/java/com/android/server/pm/UserSystemPackageInstaller.java b/services/core/java/com/android/server/pm/UserSystemPackageInstaller.java index 60864a37ef459..dfb4f2425ba75 100644 --- a/services/core/java/com/android/server/pm/UserSystemPackageInstaller.java +++ b/services/core/java/com/android/server/pm/UserSystemPackageInstaller.java @@ -219,38 +219,21 @@ class UserSystemPackageInstaller { // Install/uninstall system packages per user. for (int userId : mUm.getUserIds()) { - final Set userWhitelist = getInstallablePackagesForUserId(userId); + final Set userAllowlist = getInstallablePackagesForUserId(userId); - // If null, run for all packages - if (userWhitelist == null) { - pmInt.forEachPackageState(packageState -> { - if (packageState.getPkg() == null) { - return; - } - final boolean install = !packageState.getTransientState() - .isHiddenUntilInstalled(); - if (packageState.getUserStateOrDefault(userId).isInstalled() != install - && shouldChangeInstallationState(packageState, install, userId, - isFirstBoot, isConsideredUpgrade, preExistingPackages)) { - changesToCommit.add(userId, packageState.getPackageName(), install); - } - }); - } else { - for (String packageName : userWhitelist) { - PackageStateInternal packageState = pmInt.getPackageStateInternal(packageName); - if (packageState.getPkg() == null) { - continue; - } - - final boolean install = !packageState.getTransientState() - .isHiddenUntilInstalled(); - if (packageState.getUserStateOrDefault(userId).isInstalled() != install - && shouldChangeInstallationState(packageState, install, userId, - isFirstBoot, isConsideredUpgrade, preExistingPackages)) { - changesToCommit.add(userId, packageState.getPackageName(), install); - } + pmInt.forEachPackageState(packageState -> { + if (packageState.getPkg() == null) { + return; } - } + boolean install = (userAllowlist == null + || userAllowlist.contains(packageState.getPackageName())) + && !packageState.getTransientState().isHiddenUntilInstalled(); + if (packageState.getUserStateOrDefault(userId).isInstalled() != install + && shouldChangeInstallationState(packageState, install, userId, + isFirstBoot, isConsideredUpgrade, preExistingPackages)) { + changesToCommit.add(userId, packageState.getPackageName(), install); + } + }); } pmInt.commitPackageStateMutation(null, packageStateMutator -> {