DO NOT MERGE Do not call RecoverySystem with DPMS lock held

Note DPM.wipeData() on a secondary user is now blocking, just like
it's been always blocking on the primary user.

Bug 30681079

Change-Id: Ia832bed0f22396998d6307ab46e262dae9463838
This commit is contained in:
Suprabh Shukla
2017-01-31 13:01:28 -08:00
parent a1d59972ad
commit 4ffe72dcc8

View File

@@ -3317,7 +3317,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
} }
} }
private void wipeDataLocked(boolean wipeExtRequested, String reason) { private void wipeDataNoLock(boolean wipeExtRequested, String reason) {
if (wipeExtRequested) { if (wipeExtRequested) {
StorageManager sm = (StorageManager) mContext.getSystemService( StorageManager sm = (StorageManager) mContext.getSystemService(
Context.STORAGE_SERVICE); Context.STORAGE_SERVICE);
@@ -3336,13 +3336,13 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
return; return;
} }
enforceCrossUserPermission(userHandle); enforceCrossUserPermission(userHandle);
final String source;
synchronized (this) { synchronized (this) {
// This API can only be called by an active device admin, // This API can only be called by an active device admin,
// so try to retrieve it to check that the caller is one. // so try to retrieve it to check that the caller is one.
final ActiveAdmin admin = getActiveAdminForCallerLocked(null, final ActiveAdmin admin = getActiveAdminForCallerLocked(null,
DeviceAdminInfo.USES_POLICY_WIPE_DATA); DeviceAdminInfo.USES_POLICY_WIPE_DATA);
final String source;
final ComponentName cname = admin.info.getComponent(); final ComponentName cname = admin.info.getComponent();
if (cname != null) { if (cname != null) {
source = cname.flattenToShortString(); source = cname.flattenToShortString();
@@ -3367,39 +3367,44 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
manager.wipe(); manager.wipe();
} }
} }
boolean wipeExtRequested = (flags & WIPE_EXTERNAL_STORAGE) != 0;
wipeDeviceOrUserLocked(wipeExtRequested, userHandle,
"DevicePolicyManager.wipeData() from " + source);
} finally { } finally {
Binder.restoreCallingIdentity(ident); Binder.restoreCallingIdentity(ident);
} }
} }
boolean wipeExtRequested = (flags & WIPE_EXTERNAL_STORAGE) != 0;
wipeDeviceNoLock(wipeExtRequested, userHandle,
"DevicePolicyManager.wipeData() from " + source);
} }
private void wipeDeviceOrUserLocked(boolean wipeExtRequested, final int userHandle, String reason) { private void wipeDeviceNoLock(boolean wipeExtRequested, final int userHandle, String reason) {
if (userHandle == UserHandle.USER_OWNER) { long ident = Binder.clearCallingIdentity();
wipeDataLocked(wipeExtRequested, reason); try {
} else { if (userHandle == UserHandle.USER_OWNER) {
mHandler.post(new Runnable() { wipeDataNoLock(wipeExtRequested, reason);
@Override } else {
public void run() { mHandler.post(new Runnable() {
try { @Override
IActivityManager am = ActivityManagerNative.getDefault(); public void run() {
if (am.getCurrentUser().id == userHandle) { try {
am.switchUser(UserHandle.USER_OWNER); IActivityManager am = ActivityManagerNative.getDefault();
} if (am.getCurrentUser().id == userHandle) {
am.switchUser(UserHandle.USER_OWNER);
}
boolean isManagedProfile = isManagedProfile(userHandle); boolean isManagedProfile = isManagedProfile(userHandle);
if (!mUserManager.removeUser(userHandle)) { if (!mUserManager.removeUser(userHandle)) {
Slog.w(LOG_TAG, "Couldn't remove user " + userHandle); Slog.w(LOG_TAG, "Couldn't remove user " + userHandle);
} else if (isManagedProfile) { } else if (isManagedProfile) {
sendWipeProfileNotification(); sendWipeProfileNotification();
}
} catch (RemoteException re) {
// Shouldn't happen
} }
} catch (RemoteException re) {
// Shouldn't happen
} }
} });
}); }
} finally {
Binder.restoreCallingIdentity(ident);
} }
} }
@@ -3557,7 +3562,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub {
} }
if (wipeData) { if (wipeData) {
// Call without holding lock. // Call without holding lock.
wipeDeviceOrUserLocked(false, identifier, wipeDeviceNoLock(false, identifier,
"reportFailedPasswordAttempt()"); "reportFailedPasswordAttempt()");
} }
} finally { } finally {