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
This commit is contained in:
Ayush Sharma
2023-05-26 11:10:51 +00:00
parent 1a2ab4f88b
commit 9df1e0a729

View File

@@ -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<String> excludedPkgs = removeInvalidPkgsForMeteredDataRestriction(
caller.getUserId(), packageNames);
return mInjector.binderWithCleanCallingIdentity(() -> {
final List<String> 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<String> removeInvalidPkgsForMeteredDataRestriction(
int userId, List<String> pkgNames) {
final Set<String> activeAdmins = getActiveAdminPackagesLocked(userId);
final List<String> 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<String> activeAdmins = getActiveAdminPackagesLocked(userId);
final List<String> 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