From cb2ba4bd13a0bb4c0aed62001c2bc983eb1ce1e8 Mon Sep 17 00:00:00 2001 From: bkchoi Date: Mon, 11 Jul 2022 13:19:05 -0700 Subject: 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 | 45 +++++++--------------- 1 file changed, 14 insertions(+), 31 deletions(-) diff --git a/services/core/java/com/android/server/pm/UserSystemPackageInstaller.java b/services/core/java/com/android/server/pm/UserSystemPackageInstaller.java index 60864a37ef45..dfb4f2425ba7 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); - - // 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); - } + final Set userAllowlist = getInstallablePackagesForUserId(userId); + + 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 -> { -- cgit v1.2.3-59-g8ed1b