From 2b8bf40f608e169ec349180da161f108af22f50a Mon Sep 17 00:00:00 2001 From: felipeal Date: Mon, 27 Jul 2020 19:14:36 -0700 Subject: [PATCH] Fixed how com.android.server.pm.Settings handle pre-created users. Its getAllUsers() method was not returning pre-created users, so packages installed for a "regular" user were not marked as "installed=false" for the pre-created users. Hence, when the pre-created was "promoted" to a full user, it contained such packages. Here's how to reproduce the issue: $ m -j ApiDemos $ adb shell pm create-user --pre-create-only Success: created user id 10 $ adb install --user cur $OUT/testcases/ApiDemos/arm64/ApiDemos.apk Performing Streamed Install Success $ adb shell pm list packages --user cur | grep com.example.android.apis || echo package:com.example.android.apis $ adb shell pm list packages --user 10 | grep com.example.android.apis || echo "NOT FOUND" package:com.example.android.apis # Should return "NOT FOUND" $ adb shell pm create-user FullUserIAm Success: created user id 10 $ adb shell pm list packages --user 10 | grep com.example.android.apis || echo "NOT FOUND" package:com.example.android.apis # Should return "NOT FOUND" With this fix, it returns "NOT FOUND" in the expected steps. Fixes: 160252062 Fixes: 162847145 Test: see above Merged-In: I6cd17ac588a4d95bf0ea704dd18387e19eeab374 Change-Id: I6cd17ac588a4d95bf0ea704dd18387e19eeab374 (cherry picked from commit 00175974ba24d982ecfe760ee78a1a17bb326d04) --- .../java/com/android/server/pm/Settings.java | 32 +++++++++++++++---- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index 994fca80e672c..2657751b9f29d 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -2649,7 +2649,7 @@ public final class Settings { private void writePackageListLPrInternal(int creatingUserId) { // Only derive GIDs for active users (not dying) - final List users = getUsers(UserManagerService.getInstance(), true); + final List users = getActiveUsers(UserManagerService.getInstance(), true); int[] userIds = new int[users.size()]; for (int i = 0; i < userIds.length; i++) { userIds[i] = users.get(i).id; @@ -4325,25 +4325,43 @@ public final class Settings { } /** - * Return all users on the device, including partial or dying users. + * Returns all users on the device, including pre-created and dying users. + * * @param userManager UserManagerService instance * @return the list of users */ private static List getAllUsers(UserManagerService userManager) { - return getUsers(userManager, false); + return getUsers(userManager, /* excludeDying= */ false, /* excludePreCreated= */ false); } /** - * Return the list of users on the device. Clear the calling identity before calling into - * UserManagerService. + * Returns the list of users on the device, excluding pre-created ones. + * * @param userManager UserManagerService instance * @param excludeDying Indicates whether to exclude any users marked for deletion. + * * @return the list of users */ - private static List getUsers(UserManagerService userManager, boolean excludeDying) { + private static List getActiveUsers(UserManagerService userManager, + boolean excludeDying) { + return getUsers(userManager, excludeDying, /* excludePreCreated= */ true); + } + + /** + * Returns the list of users on the device. + * + * @param userManager UserManagerService instance + * @param excludeDying Indicates whether to exclude any users marked for deletion. + * @param excludePreCreated Indicates whether to exclude any pre-created users. + * + * @return the list of users + */ + private static List getUsers(UserManagerService userManager, boolean excludeDying, + boolean excludePreCreated) { long id = Binder.clearCallingIdentity(); try { - return userManager.getUsers(excludeDying); + return userManager.getUsers(/* excludePartial= */ true, excludeDying, + excludePreCreated); } catch (NullPointerException npe) { // packagemanager not yet initialized } finally {