Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 21992d99 authored by Suprabh Shukla's avatar Suprabh Shukla Committed by android-build-merger
Browse files

DO NOT MERGE Do not call RecoverySystem with DPMS lock held

am: 8cdc0495

Change-Id: I7c1b9e9f785ef99575136d9af0b062dad759c17a
parents d417e548 8cdc0495
Loading
Loading
Loading
Loading
+20 −16
Original line number Diff line number Diff line
@@ -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);
            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,25 +2313,29 @@ 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 {
            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);
                }
            }
            if (wipeData) {
                wipeDeviceNoLock(0, userHandle);
            }
        } finally {
            Binder.restoreCallingIdentity(ident);
        }
    }
    }

    public void reportSuccessfulPasswordAttempt(int userHandle) {
        enforceCrossUserPermission(userHandle);