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

Commit 4fb297e3 authored by Ayush Sharma's avatar Ayush Sharma
Browse files

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
parent b1023455
Loading
Loading
Loading
Loading
+13 −12
Original line number Diff line number Diff line
@@ -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<String> excludedPkgs = removeInvalidPkgsForMeteredDataRestriction(
                        caller.getUserId(), packageNames);
                admin.meteredDisabledPackages = packageNames;
                pushMeteredDisabledPackagesLocked(caller.getUserId());
                pushMeteredDisabledPackages(caller.getUserId());
                saveSettingsLocked(caller.getUserId());
                return excludedPkgs;
            });
@@ -14884,22 +14884,23 @@ 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<String> getMeteredDisabledPackagesLocked(int userId) {
        final ComponentName who = getOwnerComponent(userId);
    private Set<String> getMeteredDisabledPackages(int userId) {
        synchronized (getLockObject()) {
            final Set<String> restrictedPkgs = new ArraySet<>();
        if (who != null) {
            final ActiveAdmin admin = getActiveAdminUncheckedLocked(who, userId);
            final ActiveAdmin admin = getDeviceOrProfileOwnerAdminLocked(userId);
            if (admin != null && admin.meteredDisabledPackages != null) {
                restrictedPkgs.addAll(admin.meteredDisabledPackages);
            }
        }
            return restrictedPkgs;
        }
    }
    @Override
    public void setAffiliationIds(ComponentName admin, List<String> ids) {
@@ -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);