summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/java/com/android/server/DevicePolicyManagerService.java36
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);
}
}