diff options
| author | 2024-05-08 14:36:44 +0100 | |
|---|---|---|
| committer | 2024-05-09 12:19:28 +0100 | |
| commit | d7e8f3d6a0fcd3c1cc43a4b3e1e7501141be7ed8 (patch) | |
| tree | f2d40b02401da049cd03971cef82917e33f14d83 | |
| parent | b0133d13b0938fe3029cc6deb810fa31aef5d7ba (diff) | |
UM.getAliveUsers to exclude initialised ephemeral noncurrent users.
When the device is rebooted while an ephemeral user is in foreground,
after the reboot UserManager.getAliveUsers() was containing that user
as well, which was causing a FATAL exception in BiometricScheduler
during boot.
This CL fixes that issue by excluding the initialised ephemeral
non-current users from UserManager.getAliveUsers().
Bug: 327972305
Test: atest UserManagerServiceTest#testGetAliveUsers_shouldExcludeInitialisedEphemeralNonCurrentUsers
Flag: None
Change-Id: I44cbb1e27e1aa84a5f78786d9e05d02a029fa5b3
| -rw-r--r-- | services/core/java/com/android/server/pm/UserManagerService.java | 13 | ||||
| -rw-r--r-- | services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceTest.java | 43 |
2 files changed, 55 insertions, 1 deletions
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index 3c702b4125b7..ba845dacefd8 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -1371,7 +1371,7 @@ public class UserManagerService extends IUserManager.Stub { for (int i = 0; i < userSize; i++) { UserInfo ui = mUsers.valueAt(i).info; if ((excludePartial && ui.partial) - || (excludeDying && mRemovingUserIds.get(ui.id)) + || (excludeDying && isDyingLU(ui)) || (excludePreCreated && ui.preCreated)) { continue; } @@ -1381,6 +1381,17 @@ public class UserManagerService extends IUserManager.Stub { } } + @GuardedBy("mUsersLock") + private boolean isDyingLU(UserInfo ui) { + if (mRemovingUserIds.get(ui.id)) { + return true; + } + if (ui.isEphemeral() && ui.isInitialized() && ui.id != getCurrentUserId()) { + return true; + } + return false; + } + @Override public List<UserInfo> getProfiles(@UserIdInt int userId, boolean enabledOnly) { boolean returnFullInfo; diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceTest.java b/services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceTest.java index 79f1574105ba..7d58a2e53693 100644 --- a/services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceTest.java @@ -778,6 +778,49 @@ public final class UserManagerServiceTest { } @Test + public void testGetAliveUsers_shouldExcludeInitialisedEphemeralNonCurrentUsers() { + assertWithMessage("Ephemeral user should not exist at all initially") + .that(mUmi.getUsers(false).stream().anyMatch(u -> u.id == USER_ID)) + .isFalse(); + + // add an ephemeral full user + TestUserData userData = new TestUserData(USER_ID); + userData.info.flags = UserInfo.FLAG_FULL | UserInfo.FLAG_EPHEMERAL; + addUserData(userData); + + assertWithMessage("Ephemeral user should exist as alive after being created") + .that(mUmi.getUsers(true).stream().anyMatch(u -> u.id == USER_ID)) + .isTrue(); + + // mock switch to the user (mark it as initialized & make it the current user) + userData.info.flags |= UserInfo.FLAG_INITIALIZED; + mockCurrentUser(USER_ID); + + assertWithMessage("Ephemeral user should still exist as alive after being switched to") + .that(mUmi.getUsers(true).stream().anyMatch(u -> u.id == USER_ID)) + .isTrue(); + + // switch away from the user + mockCurrentUser(OTHER_USER_ID); + + assertWithMessage("Ephemeral user should not exist as alive after getting switched away") + .that(mUmi.getUsers(true).stream().anyMatch(u -> u.id == USER_ID)) + .isFalse(); + + assertWithMessage("Ephemeral user should still exist as dying after getting switched away") + .that(mUmi.getUsers(false).stream().anyMatch(u -> u.id == USER_ID)) + .isTrue(); + + // finally remove the user + mUms.removeUserInfo(USER_ID); + + assertWithMessage("Ephemeral user should not exist at all after cleanup") + .that(mUmi.getUsers(false).stream().anyMatch(u -> u.id == USER_ID)) + .isFalse(); + } + + + @Test @RequiresFlagsEnabled({android.os.Flags.FLAG_ALLOW_PRIVATE_PROFILE, Flags.FLAG_BLOCK_PRIVATE_SPACE_CREATION, Flags.FLAG_ENABLE_PRIVATE_SPACE_FEATURES}) public void testCreatePrivateProfileOnHeadlessSystemUser_shouldAllowCreation() { |