From 0954015735aff6123357f20b8310db7d81cfdd1b Mon Sep 17 00:00:00 2001 From: Eric Biggers Date: Fri, 14 Oct 2022 19:05:04 +0000 Subject: [PATCH] Fix locksettings state removal on user removal http://ag/19542373 (commit 78e245a21a11) made locksettings state removal happen later during user removal than it did before. Unfortunately, this made it stop working properly, since by the time it runs, the /data/system_de/$userId/spblob/ directory has been locked by StorageManager.destroyUserKey(). As a result, resources used by synthetic password protectors, e.g. Weaver slots, stopped being freed. Fix this by cleaning up the lock settings state *before* destroying the user keys. Bug: 232452368 Bug: 253631183 Test: 'pm create-user 10 && pm remove-user 10', then checked log to verify that the Weaver slot was removed. Change-Id: Ib3e7586bfde37632b77c7655bc91692ee6daad86 --- .../java/com/android/server/pm/UserManagerService.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index 0a4669c0aace6..5c42d20e3b68e 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -5495,6 +5495,13 @@ public class UserManagerService extends IUserManager.Stub { private void removeUserState(final @UserIdInt int userId) { Slog.i(LOG_TAG, "Removing user state of user " + userId); + + // Cleanup lock settings. This must happen before destroyUserKey(), since the user's DE + // storage must still be accessible for the lock settings state to be properly cleaned up. + mLockPatternUtils.removeUser(userId); + + // Evict and destroy the user's CE and DE encryption keys. At this point, the user's CE and + // DE storage is made inaccessible, except to delete its contents. try { mContext.getSystemService(StorageManager.class).destroyUserKey(userId); } catch (IllegalStateException e) { @@ -5502,9 +5509,6 @@ public class UserManagerService extends IUserManager.Stub { Slog.i(LOG_TAG, "Destroying key for user " + userId + " failed, continuing anyway", e); } - // Cleanup lock settings - mLockPatternUtils.removeUser(userId); - // Cleanup package manager settings mPm.cleanUpUser(this, userId);