From 9df1e0a7294432f3efab07d7c08b23b053d44142 Mon Sep 17 00:00:00 2001 From: Ayush Sharma Date: Fri, 26 May 2023 11:10:51 +0000 Subject: [PATCH] Fix deadlock between NPMS and DPMS Bug: 264898256 Fixes: 264940087 Fixes: 255306060 Test: atest MixedManagedProfileOwnerTest#testSetMeteredDataDisabledPackages atest MixedProfileOwnerTest#testSetMeteredDataDisabledPackages atest MixedDeviceOwnerTest#testSetMeteredDataDisabledPackages Change-Id: I4ad190cabe01c92fe392a5851033c5bf3469c3ca --- .../DevicePolicyManagerService.java | 55 ++++++++++--------- 1 file changed, 29 insertions(+), 26 deletions(-) diff --git a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java index 0140801323db3..f4b3cab7bda0e 100644 --- a/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java +++ b/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java @@ -1412,7 +1412,6 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { policy.mAdminList.remove(i); policy.mAdminMap.remove(aa.info.getComponent()); pushActiveAdminPackagesLocked(userHandle); - pushMeteredDisabledPackages(userHandle); } } } catch (RemoteException re) { @@ -1453,6 +1452,7 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (removedAdmin) { // The removed admin might have disabled camera, so update user restrictions. pushUserRestrictions(userHandle); + pushMeteredDisabledPackages(userHandle); } } @@ -17875,41 +17875,44 @@ public class DevicePolicyManagerService extends IDevicePolicyManager.Stub { if (!mHasFeature) { return packageNames; } - synchronized (getLockObject()) { - final ActiveAdmin admin = getProfileOwnerOrDeviceOwnerLocked(caller.getUserId()); - return mInjector.binderWithCleanCallingIdentity(() -> { - final List excludedPkgs = removeInvalidPkgsForMeteredDataRestriction( - caller.getUserId(), packageNames); + return mInjector.binderWithCleanCallingIdentity(() -> { + final List excludedPkgs = removeInvalidPkgsForMeteredDataRestriction( + caller.getUserId(), packageNames); + + synchronized (getLockObject()) { + final ActiveAdmin admin = getProfileOwnerOrDeviceOwnerLocked(caller.getUserId()); admin.meteredDisabledPackages = packageNames; - pushMeteredDisabledPackages(caller.getUserId()); saveSettingsLocked(caller.getUserId()); - return excludedPkgs; - }); - } + } + pushMeteredDisabledPackages(caller.getUserId()); + return excludedPkgs; + }); } private List removeInvalidPkgsForMeteredDataRestriction( int userId, List pkgNames) { - final Set activeAdmins = getActiveAdminPackagesLocked(userId); - final List excludedPkgs = new ArrayList<>(); - for (int i = pkgNames.size() - 1; i >= 0; --i) { - final String pkgName = pkgNames.get(i); - // If the package is an active admin, don't restrict it. - if (activeAdmins.contains(pkgName)) { - excludedPkgs.add(pkgName); - continue; - } - // If the package doesn't exist, don't restrict it. - try { - if (!mInjector.getIPackageManager().isPackageAvailable(pkgName, userId)) { + synchronized (getLockObject()) { + final Set activeAdmins = getActiveAdminPackagesLocked(userId); + final List excludedPkgs = new ArrayList<>(); + for (int i = pkgNames.size() - 1; i >= 0; --i) { + final String pkgName = pkgNames.get(i); + // If the package is an active admin, don't restrict it. + if (activeAdmins.contains(pkgName)) { excludedPkgs.add(pkgName); + continue; + } + // If the package doesn't exist, don't restrict it. + try { + if (!mInjector.getIPackageManager().isPackageAvailable(pkgName, userId)) { + excludedPkgs.add(pkgName); + } + } catch (RemoteException e) { + // Should not happen } - } catch (RemoteException e) { - // Should not happen } + pkgNames.removeAll(excludedPkgs); + return excludedPkgs; } - pkgNames.removeAll(excludedPkgs); - return excludedPkgs; } @Override