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

Commit 6b65ec77 authored by Chalard Jean's avatar Chalard Jean
Browse files

Fix: VPNs update caps upon underlying network disconnect.

Bug: 79748782
Test: ConnectivityServiceTests still pass
Change-Id: Ic8231b18a17e6feb5ebafe8d5688fb59f9d4d58e
parent f89e8dac
Loading
Loading
Loading
Loading
+25 −7
Original line number Diff line number Diff line
@@ -2503,6 +2503,9 @@ public class ConnectivityService extends IConnectivityManager.Stub
                ensureNetworkTransitionWakelock(nai.name());
            }
            mLegacyTypeTracker.remove(nai, wasDefault);
            if (!nai.networkCapabilities.hasTransport(TRANSPORT_VPN)) {
                updateAllVpnsCapabilities();
            }
            rematchAllNetworksAndRequests(null, 0);
            mLingerMonitor.noteDisconnect(nai);
            if (nai.created) {
@@ -3778,6 +3781,26 @@ public class ConnectivityService extends IConnectivityManager.Stub
        }
    }

    /**
     * Ask all VPN objects to recompute and update their capabilities.
     *
     * When underlying networks change, VPNs may have to update capabilities to reflect things
     * like the metered bit, their transports, and so on. This asks the VPN objects to update
     * their capabilities, and as this will cause them to send messages to the ConnectivityService
     * handler thread through their agent, this is asynchronous. When the capabilities objects
     * are computed they will be up-to-date as they are computed synchronously from here and
     * this is running on the ConnectivityService thread.
     * TODO : Fix this and call updateCapabilities inline to remove out-of-order events.
     */
    private void updateAllVpnsCapabilities() {
        synchronized (mVpns) {
            for (int i = 0; i < mVpns.size(); i++) {
                final Vpn vpn = mVpns.valueAt(i);
                vpn.updateCapabilities();
            }
        }
    }

    @Override
    public boolean updateLockdownVpn() {
        if (Binder.getCallingUid() != Process.SYSTEM_UID) {
@@ -4935,12 +4958,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
        if (!newNc.hasTransport(TRANSPORT_VPN)) {
            // Tell VPNs about updated capabilities, since they may need to
            // bubble those changes through.
            synchronized (mVpns) {
                for (int i = 0; i < mVpns.size(); i++) {
                    final Vpn vpn = mVpns.valueAt(i);
                    vpn.updateCapabilities();
                }
            }
            updateAllVpnsCapabilities();
        }
    }

+16 −18
Original line number Diff line number Diff line
@@ -4405,7 +4405,6 @@ public class ConnectivityServiceTest {
                && !caps.hasCapability(NET_CAPABILITY_NOT_METERED),
                vpnNetworkAgent);

        if (false) { // TODO : reactivate this ; in the current state, the below fail.
        // Disconnect cell. Receive update without even removing the dead network from the
        // underlying networks – it's dead anyway. Not metered any more.
        mCellNetworkAgent.disconnect();
@@ -4422,7 +4421,6 @@ public class ConnectivityServiceTest {
                && !caps.hasTransport(TRANSPORT_CELLULAR) && !caps.hasTransport(TRANSPORT_WIFI)
                && caps.hasCapability(NET_CAPABILITY_NOT_METERED),
                vpnNetworkAgent);
        }

        mMockVpn.disconnect();
    }