diff options
| -rw-r--r-- | services/java/com/android/server/DevicePolicyManagerService.java | 36 |
1 files changed, 20 insertions, 16 deletions
diff --git a/services/java/com/android/server/DevicePolicyManagerService.java b/services/java/com/android/server/DevicePolicyManagerService.java index 2bb99d68ed77..abd70977bb54 100644 --- a/services/java/com/android/server/DevicePolicyManagerService.java +++ b/services/java/com/android/server/DevicePolicyManagerService.java @@ -2157,7 +2157,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { } } - void wipeDataLocked(int flags) { + void wipeDataNoLock(int flags) { // If the SD card is encrypted and non-removable, we have to force a wipe. boolean forceExtWipe = !Environment.isExternalStorageRemovable() && isExtStorageEncrypted(); boolean wipeExtRequested = (flags&DevicePolicyManager.WIPE_EXTERNAL_STORAGE) != 0; @@ -2188,18 +2188,18 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { // so try to retrieve it to check that the caller is one. getActiveAdminForCallerLocked(null, DeviceAdminInfo.USES_POLICY_WIPE_DATA); - long ident = Binder.clearCallingIdentity(); - try { - wipeDeviceOrUserLocked(flags, userHandle); - } finally { - Binder.restoreCallingIdentity(ident); - } + } + long ident = Binder.clearCallingIdentity(); + try { + wipeDeviceNoLock(flags, userHandle); + } finally { + Binder.restoreCallingIdentity(ident); } } - private void wipeDeviceOrUserLocked(int flags, final int userHandle) { + private void wipeDeviceNoLock(int flags, final int userHandle) { if (userHandle == UserHandle.USER_OWNER) { - wipeDataLocked(flags); + wipeDataNoLock(flags); } else { lockNowUnchecked(); mHandler.post(new Runnable() { @@ -2313,23 +2313,27 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { mContext.enforceCallingOrSelfPermission( android.Manifest.permission.BIND_DEVICE_ADMIN, null); - synchronized (this) { - DevicePolicyData policy = getUserData(userHandle); - long ident = Binder.clearCallingIdentity(); - try { + long ident = Binder.clearCallingIdentity(); + try { + boolean wipeData = false; + synchronized (this) { + DevicePolicyData policy = getUserData(userHandle); policy.mFailedPasswordAttempts++; saveSettingsLocked(userHandle); if (mHasFeature) { int max = getMaximumFailedPasswordsForWipe(null, userHandle); if (max > 0 && policy.mFailedPasswordAttempts >= max) { - wipeDeviceOrUserLocked(0, userHandle); + wipeData = true; } sendAdminCommandLocked(DeviceAdminReceiver.ACTION_PASSWORD_FAILED, DeviceAdminInfo.USES_POLICY_WATCH_LOGIN, userHandle); } - } finally { - Binder.restoreCallingIdentity(ident); } + if (wipeData) { + wipeDeviceNoLock(0, userHandle); + } + } finally { + Binder.restoreCallingIdentity(ident); } } |