summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Yasin Kilicdere <tyk@google.com> 2024-05-08 14:36:44 +0100
committer Yasin Kilicdere <tyk@google.com> 2024-05-09 12:19:28 +0100
commitd7e8f3d6a0fcd3c1cc43a4b3e1e7501141be7ed8 (patch)
treef2d40b02401da049cd03971cef82917e33f14d83
parentb0133d13b0938fe3029cc6deb810fa31aef5d7ba (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.java13
-rw-r--r--services/tests/mockingservicestests/src/com/android/server/pm/UserManagerServiceTest.java43
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() {