From 5c65b1ee1023c7d9aa449cfcfb22830afac0900f Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Wed, 19 Oct 2022 17:58:53 +0000 Subject: [PATCH] Don't prepare CE storage on user creation Since the CE key is now always protected by the synthetic password, it is no longer saved to disk before PHASE_BOOT_COMPLETED. Unfortunately, that means that if the device is rebooted after a user was created but before the CE key was written to disk, then the CE key needs to be regenerated. But that doesn't work if CE storage was already prepared. Address this by not preparing the user's CE storage at creation time. It has never actually been necessary, since the CE storage will be prepared when the user is unlocked anyway. This is also how user 0 works already (with the exception of the /data/data directory). Bug: 232452368 Bug: 251213447 Change-Id: I78ba39030bbd3d1561f822fc7711d7169a21c467 --- .../core/java/com/android/server/pm/Settings.java | 11 ++++++----- .../com/android/server/pm/UserManagerService.java | 5 ++++- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/services/core/java/com/android/server/pm/Settings.java b/services/core/java/com/android/server/pm/Settings.java index f2a7651b4daf5..8cf881fc9b229 100644 --- a/services/core/java/com/android/server/pm/Settings.java +++ b/services/core/java/com/android/server/pm/Settings.java @@ -4185,15 +4185,16 @@ public final class Settings implements Watchable, Snappable { // such as APEX continue; } - // Need to create a data directory for all apps installed for this user. - // Accumulate all required args and call the installer after mPackages lock - // has been released + // We need to create the DE data directory for all apps installed for this user. + // (CE storage is not ready yet; the CE data directories will be created later, + // when the user is "unlocked".) Accumulate all required args, and call the + // installer after the mPackages lock has been released. final String seInfo = AndroidPackageUtils.getSeInfo(ps.getPkg(), ps); final boolean usesSdk = !ps.getPkg().getUsesSdkLibraries().isEmpty(); final CreateAppDataArgs args = Installer.buildCreateAppDataArgs( ps.getVolumeUuid(), ps.getPackageName(), userHandle, - StorageManager.FLAG_STORAGE_CE | StorageManager.FLAG_STORAGE_DE, - ps.getAppId(), seInfo, ps.getPkg().getTargetSdkVersion(), usesSdk); + StorageManager.FLAG_STORAGE_DE, ps.getAppId(), seInfo, + ps.getPkg().getTargetSdkVersion(), usesSdk); batch.createAppData(args); } else { // Make sure the app is excluded from storage mapping for this user diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index 21191919c8e09..bf1fcea873619 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -4662,9 +4662,12 @@ public class UserManagerService extends IUserManager.Stub { storage.createUserKey(userId, userInfo.serialNumber, userInfo.isEphemeral()); t.traceEnd(); + // Only prepare DE storage here. CE storage will be prepared later, when the user is + // unlocked. We do this to ensure that CE storage isn't prepared before the CE key is + // saved to disk. This also matches what is done for user 0. t.traceBegin("prepareUserData"); mUserDataPreparer.prepareUserData(userId, userInfo.serialNumber, - StorageManager.FLAG_STORAGE_DE | StorageManager.FLAG_STORAGE_CE); + StorageManager.FLAG_STORAGE_DE); t.traceEnd(); t.traceBegin("LSS.createNewUser");