diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java index 135af2d739047..b9238902f44be 100644 --- a/services/core/java/com/android/server/locksettings/LockSettingsService.java +++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java @@ -2473,7 +2473,7 @@ public class LockSettingsService extends ILockSettings.Stub { private void removeUser(int userId, boolean unknownUser) { Slog.i(TAG, "RemoveUser: " + userId); removeBiometricsForUser(userId); - mSpManager.removeUser(userId); + mSpManager.removeUser(getGateKeeperService(), userId); mStrongAuth.removeUser(userId); AndroidKeyStoreMaintenance.onUserRemoved(userId); diff --git a/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java b/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java index 2da443116a42c..24bd42e7d7750 100644 --- a/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java +++ b/services/core/java/com/android/server/locksettings/SyntheticPasswordManager.java @@ -565,11 +565,18 @@ public class SyntheticPasswordManager { return response[0]; } - public void removeUser(int userId) { + public void removeUser(IGateKeeperService gatekeeper, int userId) { for (long handle : mStorage.listSyntheticPasswordHandlesForUser(SP_BLOB_NAME, userId)) { destroyWeaverSlot(handle, userId); destroySPBlobKey(getKeyName(handle)); } + // Remove potential persistent state (in RPMB), to prevent them from accumulating and + // causing problems. + try { + gatekeeper.clearSecureUserId(fakeUid(userId)); + } catch (RemoteException ignore) { + Slog.w(TAG, "Failed to clear SID from gatekeeper"); + } } int getCredentialType(long handle, int userId) {