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

Commit ac14fde2 authored by Sudheer Shanka's avatar Sudheer Shanka
Browse files

Avoid calling into phone process with NPMS locks held.

Fixes: 189311143
Test: Manually add a wifi NetworkPolicy, reboot and verify meteredness
      in NetworkPolicy is moved to WifiConfiguration.
Change-Id: Ibff1f61f8cc12e9a36fc9bbb8227c60bc3996bac
parent cc057784
Loading
Loading
Loading
Loading
+34 −29
Original line number Diff line number Diff line
@@ -1235,11 +1235,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
    final private BroadcastReceiver mWifiReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            synchronized (mUidRulesFirstLock) {
                synchronized (mNetworkPoliciesSecondLock) {
                    upgradeWifiMeteredOverrideAL();
                }
            }
            upgradeWifiMeteredOverride();
            // Only need to perform upgrade logic once
            mContext.unregisterReceiver(this);
        }
@@ -2617,36 +2613,45 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
     * Perform upgrade step of moving any user-defined meterness overrides over
     * into {@link WifiConfiguration}.
     */
    @GuardedBy({"mNetworkPoliciesSecondLock", "mUidRulesFirstLock"})
    private void upgradeWifiMeteredOverrideAL() {
        boolean modified = false;
        final WifiManager wm = mContext.getSystemService(WifiManager.class);
        final List<WifiConfiguration> configs = wm.getConfiguredNetworks();
    private void upgradeWifiMeteredOverride() {
        final ArrayMap<String, Boolean> wifiNetworkIds = new ArrayMap<>();
        synchronized (mNetworkPoliciesSecondLock) {
            for (int i = 0; i < mNetworkPolicy.size();) {
                final NetworkPolicy policy = mNetworkPolicy.valueAt(i);
                if (policy.template.getMatchRule() == NetworkTemplate.MATCH_WIFI
                        && !policy.inferred) {
                    mNetworkPolicy.removeAt(i);
                modified = true;
                    wifiNetworkIds.put(policy.template.getNetworkId(), policy.metered);
                } else {
                    i++;
                }
            }
        }

                final String networkId = resolveNetworkId(policy.template.getNetworkId());
                for (WifiConfiguration config : configs) {
                    if (Objects.equals(resolveNetworkId(config), networkId)) {
        if (wifiNetworkIds.isEmpty()) {
            return;
        }
        final WifiManager wm = mContext.getSystemService(WifiManager.class);
        final List<WifiConfiguration> configs = wm.getConfiguredNetworks();
        for (int i = 0; i < configs.size(); ++i) {
            final WifiConfiguration config = configs.get(i);
            final String networkId = resolveNetworkId(config);
            final Boolean metered = wifiNetworkIds.get(networkId);
            if (metered != null) {
                Slog.d(TAG, "Found network " + networkId + "; upgrading metered hint");
                        config.meteredOverride = policy.metered
                config.meteredOverride = metered
                        ? WifiConfiguration.METERED_OVERRIDE_METERED
                        : WifiConfiguration.METERED_OVERRIDE_NOT_METERED;
                wm.updateNetwork(config);
            }
        }
            } else {
                i++;
            }
        }
        if (modified) {

        synchronized (mUidRulesFirstLock) {
            synchronized (mNetworkPoliciesSecondLock) {
                writePolicyAL();
            }
        }
    }

    @GuardedBy({"mUidRulesFirstLock", "mNetworkPoliciesSecondLock"})
    void writePolicyAL() {