From 4fb297e3c8b125aed5e39460c0568c6690810bc5 Mon Sep 17 00:00:00 2001 From: Ayush Sharma Date: Thu, 17 Mar 2022 10:30:14 +0000 Subject: [PATCH] Fix deadlock in DPMS Dont hold lock while calling in to NetworkPolicyManagerService in removeAdminArtifacts Bug: 223382458 Test: atest com.android.server.devicepolicy.DevicePolicyManagerTest#testForceRemoveActiveAdmin_nonShellCallerWithPermission atest com.android.server.devicepolicy.DevicePolicyManagerTest#testForceRemoveActiveAdmin_ShellCaller Change-Id: I1e83201211678df203908a52759858fa7dd44e5b --- .../DevicePolicyManagerService.java | 25 ++++++++++--------- 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 5388f171854df..5a985d830da8c 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -1161,7 +1161,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { policy.mAdminList.remove(i); policy.mAdminMap.remove(aa.info.getComponent()); pushActiveAdminPackagesLocked(userHandle); - pushMeteredDisabledPackagesLocked(userHandle); + pushMeteredDisabledPackages(userHandle); } } } catch (RemoteException re) { @@ -3568,7 +3568,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { for (int i = users.size() - 1; i >= 0; --i) { final int userId = users.get(i).id; mInjector.getNetworkPolicyManagerInternal().setMeteredRestrictedPackagesAsync( - getMeteredDisabledPackagesLocked(userId), userId); + getMeteredDisabledPackages(userId), userId); } } } @@ -14738,7 +14738,7 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { final List excludedPkgs = removeInvalidPkgsForMeteredDataRestriction( caller.getUserId(), packageNames); admin.meteredDisabledPackages = packageNames; - pushMeteredDisabledPackagesLocked(caller.getUserId()); + pushMeteredDisabledPackages(caller.getUserId()); saveSettingsLocked(caller.getUserId()); return excludedPkgs; }); @@ -14884,21 +14884,22 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { mOwners.markProfileOwnerOfOrganizationOwnedDevice(userId); } - private void pushMeteredDisabledPackagesLocked(int userId) { + private void pushMeteredDisabledPackages(int userId) { + wtfIfInLock(); mInjector.getNetworkPolicyManagerInternal().setMeteredRestrictedPackages( - getMeteredDisabledPackagesLocked(userId), userId); + getMeteredDisabledPackages(userId), userId); } - private Set getMeteredDisabledPackagesLocked(int userId) { - final ComponentName who = getOwnerComponent(userId); - final Set restrictedPkgs = new ArraySet<>(); - if (who != null) { - final ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userId); + private Set getMeteredDisabledPackages(int userId) { + synchronized (getLockObject()) { + final Set restrictedPkgs = new ArraySet<>(); + final ActiveAdmin admin = getDeviceOrProfileOwnerAdminLocked(userId); if (admin != null && admin.meteredDisabledPackages != null) { restrictedPkgs.addAll(admin.meteredDisabledPackages); } + + return restrictedPkgs; } - return restrictedPkgs; } @Override @@ -15342,13 +15343,13 @@ public class DevicePolicyManagerService extends BaseIDevicePolicyManager { resetGlobalProxyLocked(policy); } pushActiveAdminPackagesLocked(userHandle); - pushMeteredDisabledPackagesLocked(userHandle); saveSettingsLocked(userHandle); updateMaximumTimeToLockLocked(userHandle); policy.mRemovingAdmins.remove(adminReceiver); Slogf.i(LOG_TAG, "Device admin " + adminReceiver + " removed from user " + userHandle); } + pushMeteredDisabledPackages(userHandle); // The removed admin might have disabled camera, so update user // restrictions. pushUserRestrictions(userHandle);