Removed FLAG_EPHEMERAL from pre-created users.
When a User is pre-created with that flag, its CE & DE keys are not persisted on storage. Hence,
when that pre-creatd user is converted to full-user, the expected keys don't exist and the user
doesn't boot properly.
This change fix the issue by making the pre-created user non-ephemeral, and changing it to
ephemeral when it's converted to a "real" user.
Test: manual verification on Automotive by creating a new user than deleting it using the UI -
that creates and switches to a new guest user (which was pre-created); without this change,
that user would be hanging with a "Android is starting..." message
Bug: 143092698
Bug: 143553590
Change-Id: I2699f55a30d72fd5a88202bf6c83f7ca7c65fac0
diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java
index 8ddfad9..3a00e60 100644
--- a/services/core/java/com/android/server/pm/UserManagerService.java
+++ b/services/core/java/com/android/server/pm/UserManagerService.java
@@ -3191,6 +3191,13 @@
flags |= UserInfo.FLAG_EPHEMERAL;
}
+ // Always clear EPHEMERAL for pre-created users, otherwise the storage key
+ // won't be persisted. The flag will be re-added (if needed) when the
+ // pre-created user is "converted" to a normal user.
+ if (preCreate) {
+ flags &= ~UserInfo.FLAG_EPHEMERAL;
+ }
+
userInfo = new UserInfo(userId, name, null, flags, userType);
userInfo.serialNumber = mNextSerialNumber++;
userInfo.creationTime = getCreationTime();
@@ -4409,6 +4416,7 @@
pw.println(" Supports switchable users: " + UserManager.supportsMultipleUsers());
pw.println(" All guests ephemeral: " + Resources.getSystem().getBoolean(
com.android.internal.R.bool.config_guestUserEphemeral));
+ pw.println(" Force ephemeral users: " + mForceEphemeralUsers);
pw.println(" Is split-system user: " + UserManager.isSplitSystemUser());
pw.println(" Is headless-system mode: " + UserManager.isHeadlessSystemUserMode());
pw.println(" User version: " + mUserVersion);