From 6eb093909c5711f2482952e3d85dab66bad234c3 Mon Sep 17 00:00:00 2001 From: Jeff Sharkey Date: Fri, 14 Nov 2014 15:57:59 -0800 Subject: [PATCH] Prevent user ID reuse until after reboot. We're still seeing rare cases where a device struggles to create a new user, probably because of a subtle bug in the FUSE daemon. To work around this, only allow user IDs reuse after reboot. Bug: 8302014 Change-Id: Id7f9fb539c6d6d1ff3d47d941af1d9e6b93eca03 --- .../android/server/pm/UserManagerService.java | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/services/core/java/com/android/server/pm/UserManagerService.java b/services/core/java/com/android/server/pm/UserManagerService.java index 0cf2249396c06..db0f53bf2f680 100644 --- a/services/core/java/com/android/server/pm/UserManagerService.java +++ b/services/core/java/com/android/server/pm/UserManagerService.java @@ -1298,7 +1298,12 @@ public class UserManagerService extends IUserManager.Stub { if (userHandle == 0 || user == null || mRemovingUserIds.get(userHandle)) { return false; } + + // We remember deleted user IDs to prevent them from being + // reused during the current boot; they can still be reused + // after a reboot. mRemovingUserIds.put(userHandle, true); + try { mAppOpsService.removeUser(userHandle); } catch (RemoteException e) { @@ -1387,18 +1392,6 @@ public class UserManagerService extends IUserManager.Stub { // Remove this user from the list mUsers.remove(userHandle); - // Have user ID linger for several seconds to let external storage VFS - // cache entries expire. This must be greater than the 'entry_valid' - // timeout used by the FUSE daemon. - mHandler.postDelayed(new Runnable() { - @Override - public void run() { - synchronized (mPackagesLock) { - mRemovingUserIds.delete(userHandle); - } - } - }, MINUTE_IN_MILLIS); - mRestrictionsPinStates.remove(userHandle); // Remove user file AtomicFile userFile = new AtomicFile(new File(mUsersDir, userHandle + XML_SUFFIX));