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

Commit 3eae4300 authored by Lorenzo Colitti's avatar Lorenzo Colitti Committed by Automerger Merge Worker
Browse files

Merge changes I24580ea4,Id48b8eab am: 07a238ab am: e4f24150 am: 463d2f3f

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/1657763

Change-Id: I9d304c35374670eb0e4dcfb9caf6b065878d97e6
parents 28e58b47 463d2f3f
Loading
Loading
Loading
Loading
+25 −6
Original line number Diff line number Diff line
@@ -320,6 +320,9 @@ public class ConnectivityService extends IConnectivityManager.Stub
    // The maximum number of network request allowed per uid before an exception is thrown.
    private static final int MAX_NETWORK_REQUESTS_PER_UID = 100;

    // The maximum number of network request allowed for system UIDs before an exception is thrown.
    private static final int MAX_NETWORK_REQUESTS_PER_SYSTEM_UID = 250;

    @VisibleForTesting
    protected int mLingerDelayMs;  // Can't be final, or test subclass constructors can't change it.
    @VisibleForTesting
@@ -335,6 +338,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
    protected final PermissionMonitor mPermissionMonitor;

    private final PerUidCounter mNetworkRequestCounter;
    private final PerUidCounter mSystemNetworkRequestCounter;

    private volatile boolean mLockdownEnabled;

@@ -1215,6 +1219,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
        mContext = Objects.requireNonNull(context, "missing Context");
        mResources = deps.getResources(mContext);
        mNetworkRequestCounter = new PerUidCounter(MAX_NETWORK_REQUESTS_PER_UID);
        mSystemNetworkRequestCounter = new PerUidCounter(MAX_NETWORK_REQUESTS_PER_SYSTEM_UID);

        mMetricsLog = logger;
        mNetworkRanker = new NetworkRanker();
@@ -4047,7 +4052,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
                }
            }
        }
        mNetworkRequestCounter.decrementCount(nri.mUid);
        decrementRequestCount(nri);
        mNetworkRequestInfoLogs.log("RELEASE " + nri);

        if (null != nri.getActiveRequest()) {
@@ -4152,6 +4157,20 @@ public class ConnectivityService extends IConnectivityManager.Stub
        }
    }

    private PerUidCounter getRequestCounter(NetworkRequestInfo nri) {
        return checkAnyPermissionOf(
                nri.mPid, nri.mUid, NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK)
                ? mSystemNetworkRequestCounter : mNetworkRequestCounter;
    }

    private void incrementRequestCountOrThrow(NetworkRequestInfo nri) {
        getRequestCounter(nri).incrementCountOrThrow(nri.mUid);
    }

    private void decrementRequestCount(NetworkRequestInfo nri) {
        getRequestCounter(nri).decrementCount(nri.mUid);
    }

    @Override
    public void setAcceptUnvalidated(Network network, boolean accept, boolean always) {
        enforceNetworkStackSettingsOrSetup();
@@ -5487,7 +5506,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
            mPid = getCallingPid();
            mUid = mDeps.getCallingUid();
            mAsUid = asUid;
            mNetworkRequestCounter.incrementCountOrThrow(mUid);
            incrementRequestCountOrThrow(this);
            /**
             * Location sensitive data not included in pending intent. Only included in
             * {@link NetworkCallback}.
@@ -5519,7 +5538,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
            mUid = mDeps.getCallingUid();
            mAsUid = asUid;
            mPendingIntent = null;
            mNetworkRequestCounter.incrementCountOrThrow(mUid);
            incrementRequestCountOrThrow(this);
            mCallbackFlags = callbackFlags;
            mCallingAttributionTag = callingAttributionTag;

@@ -5562,7 +5581,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
            mUid = nri.mUid;
            mAsUid = nri.mAsUid;
            mPendingIntent = nri.mPendingIntent;
            mNetworkRequestCounter.incrementCountOrThrow(mUid);
            incrementRequestCountOrThrow(this);
            mCallbackFlags = nri.mCallbackFlags;
            mCallingAttributionTag = nri.mCallingAttributionTag;
        }
@@ -8849,7 +8868,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
            // Decrement the reference count for this NetworkRequestInfo. The reference count is
            // incremented when the NetworkRequestInfo is created as part of
            // enforceRequestCountLimit().
            mNetworkRequestCounter.decrementCount(nri.mUid);
            decrementRequestCount(nri);
            return;
        }

@@ -8915,7 +8934,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
        // Decrement the reference count for this NetworkRequestInfo. The reference count is
        // incremented when the NetworkRequestInfo is created as part of
        // enforceRequestCountLimit().
        mNetworkRequestCounter.decrementCount(nri.mUid);
        decrementRequestCount(nri);

        iCb.unlinkToDeath(cbInfo, 0);
    }
+73 −33
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ package com.android.server;
import static android.Manifest.permission.CHANGE_NETWORK_STATE;
import static android.Manifest.permission.CONNECTIVITY_USE_RESTRICTED_NETWORKS;
import static android.Manifest.permission.NETWORK_SETTINGS;
import static android.app.PendingIntent.FLAG_IMMUTABLE;
import static android.content.Intent.ACTION_USER_ADDED;
import static android.content.Intent.ACTION_USER_REMOVED;
@@ -2474,8 +2475,7 @@ public class ConnectivityServiceTest {
    public void networkCallbacksSanitizationTest_Sanitize() throws Exception {
        mServiceContext.setPermission(NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK,
                PERMISSION_DENIED);
        mServiceContext.setPermission(Manifest.permission.NETWORK_SETTINGS,
                PERMISSION_DENIED);
        mServiceContext.setPermission(NETWORK_SETTINGS, PERMISSION_DENIED);
        doNetworkCallbacksSanitizationTest(true /* sanitized */);
    }
@@ -2483,7 +2483,7 @@ public class ConnectivityServiceTest {
    public void networkCallbacksSanitizationTest_NoSanitize_NetworkStack() throws Exception {
        mServiceContext.setPermission(NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK,
                PERMISSION_GRANTED);
        mServiceContext.setPermission(Manifest.permission.NETWORK_SETTINGS, PERMISSION_DENIED);
        mServiceContext.setPermission(NETWORK_SETTINGS, PERMISSION_DENIED);
        doNetworkCallbacksSanitizationTest(false /* sanitized */);
    }
@@ -2491,7 +2491,7 @@ public class ConnectivityServiceTest {
    public void networkCallbacksSanitizationTest_NoSanitize_Settings() throws Exception {
        mServiceContext.setPermission(NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK,
                PERMISSION_DENIED);
        mServiceContext.setPermission(Manifest.permission.NETWORK_SETTINGS, PERMISSION_GRANTED);
        mServiceContext.setPermission(NETWORK_SETTINGS, PERMISSION_GRANTED);
        doNetworkCallbacksSanitizationTest(false /* sanitized */);
    }
@@ -3615,8 +3615,7 @@ public class ConnectivityServiceTest {
    @Test
    public void testCaptivePortalApi() throws Exception {
        mServiceContext.setPermission(
                android.Manifest.permission.NETWORK_SETTINGS, PERMISSION_GRANTED);
        mServiceContext.setPermission(NETWORK_SETTINGS, PERMISSION_GRANTED);
        final TestNetworkCallback captivePortalCallback = new TestNetworkCallback();
        final NetworkRequest captivePortalRequest = new NetworkRequest.Builder()
@@ -3650,8 +3649,7 @@ public class ConnectivityServiceTest {
    private TestNetworkCallback setupNetworkCallbackAndConnectToWifi() throws Exception {
        // Grant NETWORK_SETTINGS permission to be able to receive LinkProperties change callbacks
        // with sensitive (captive portal) data
        mServiceContext.setPermission(
                android.Manifest.permission.NETWORK_SETTINGS, PERMISSION_GRANTED);
        mServiceContext.setPermission(NETWORK_SETTINGS, PERMISSION_GRANTED);
        final TestNetworkCallback captivePortalCallback = new TestNetworkCallback();
        final NetworkRequest captivePortalRequest = new NetworkRequest.Builder()
@@ -4085,8 +4083,7 @@ public class ConnectivityServiceTest {
    @Test
    public void testRegisterDefaultNetworkCallback() throws Exception {
        // NETWORK_SETTINGS is necessary to call registerSystemDefaultNetworkCallback.
        mServiceContext.setPermission(Manifest.permission.NETWORK_SETTINGS,
                PERMISSION_GRANTED);
        mServiceContext.setPermission(NETWORK_SETTINGS, PERMISSION_GRANTED);
        final TestNetworkCallback defaultNetworkCallback = new TestNetworkCallback();
        mCm.registerDefaultNetworkCallback(defaultNetworkCallback);
@@ -4245,8 +4242,7 @@ public class ConnectivityServiceTest {
                () -> mCm.registerDefaultNetworkCallbackAsUid(APP1_UID, callback, handler));
        callback.assertNoCallback();
        mServiceContext.setPermission(Manifest.permission.NETWORK_SETTINGS,
                PERMISSION_GRANTED);
        mServiceContext.setPermission(NETWORK_SETTINGS, PERMISSION_GRANTED);
        mCm.registerSystemDefaultNetworkCallback(callback, handler);
        callback.expectAvailableCallbacksUnvalidated(mCellNetworkAgent);
        mCm.unregisterNetworkCallback(callback);
@@ -5616,10 +5612,11 @@ public class ConnectivityServiceTest {
    }
    @Test
    public void testNetworkCallbackMaximum() {
    public void testNetworkCallbackMaximum() throws Exception {
        final int MAX_REQUESTS = 100;
        final int CALLBACKS = 89;
        final int INTENTS = 11;
        final int SYSTEM_ONLY_MAX_REQUESTS = 250;
        assertEquals(MAX_REQUESTS, CALLBACKS + INTENTS);
        NetworkRequest networkRequest = new NetworkRequest.Builder().build();
@@ -5668,6 +5665,33 @@ public class ConnectivityServiceTest {
                                new Intent("d"), FLAG_IMMUTABLE))
        );
        // The system gets another SYSTEM_ONLY_MAX_REQUESTS slots.
        final Handler handler = new Handler(ConnectivityThread.getInstanceLooper());
        withPermission(NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, () -> {
            ArrayList<NetworkCallback> systemRegistered = new ArrayList<>();
            for (int i = 0; i < SYSTEM_ONLY_MAX_REQUESTS - 1; i++) {
                NetworkCallback cb = new NetworkCallback();
                if (i % 2 == 0) {
                    mCm.registerDefaultNetworkCallbackAsUid(1000000 + i, cb, handler);
                } else {
                    mCm.registerNetworkCallback(networkRequest, cb);
                }
                systemRegistered.add(cb);
            }
            waitForIdle();
            assertThrows(TooManyRequestsException.class, () ->
                    mCm.registerDefaultNetworkCallbackAsUid(1001042, new NetworkCallback(),
                            handler));
            assertThrows(TooManyRequestsException.class, () ->
                    mCm.registerNetworkCallback(networkRequest, new NetworkCallback()));
            for (NetworkCallback callback : systemRegistered) {
                mCm.unregisterNetworkCallback(callback);
            }
            waitForIdle();  // Wait for requests to be unregistered before giving up the permission.
        });
        for (Object o : registered) {
            if (o instanceof NetworkCallback) {
                mCm.unregisterNetworkCallback((NetworkCallback)o);
@@ -5693,6 +5717,30 @@ public class ConnectivityServiceTest {
        }
        waitForIdle();
        for (int i = 0; i < MAX_REQUESTS; i++) {
            NetworkCallback networkCallback = new NetworkCallback();
            mCm.registerDefaultNetworkCallback(networkCallback);
            mCm.unregisterNetworkCallback(networkCallback);
        }
        waitForIdle();
        for (int i = 0; i < MAX_REQUESTS; i++) {
            NetworkCallback networkCallback = new NetworkCallback();
            mCm.registerDefaultNetworkCallback(networkCallback);
            mCm.unregisterNetworkCallback(networkCallback);
        }
        waitForIdle();
        withPermission(NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK, () -> {
            for (int i = 0; i < MAX_REQUESTS; i++) {
                NetworkCallback networkCallback = new NetworkCallback();
                mCm.registerDefaultNetworkCallbackAsUid(1000000 + i, networkCallback,
                        new Handler(ConnectivityThread.getInstanceLooper()));
                mCm.unregisterNetworkCallback(networkCallback);
            }
        });
        waitForIdle();
        for (int i = 0; i < MAX_REQUESTS; i++) {
            final PendingIntent pendingIntent = PendingIntent.getBroadcast(
                    mContext, 0 /* requestCode */, new Intent("e" + i), FLAG_IMMUTABLE);
@@ -6686,8 +6734,7 @@ public class ConnectivityServiceTest {
    @Test
    public void testVpnNetworkActive() throws Exception {
        // NETWORK_SETTINGS is necessary to call registerSystemDefaultNetworkCallback.
        mServiceContext.setPermission(Manifest.permission.NETWORK_SETTINGS,
                PERMISSION_GRANTED);
        mServiceContext.setPermission(NETWORK_SETTINGS, PERMISSION_GRANTED);
        final int uid = Process.myUid();
@@ -7179,8 +7226,7 @@ public class ConnectivityServiceTest {
    @Test
    public void testRestrictedProfileAffectsVpnUidRanges() throws Exception {
        // NETWORK_SETTINGS is necessary to see the UID ranges in NetworkCapabilities.
        mServiceContext.setPermission(Manifest.permission.NETWORK_SETTINGS,
                PERMISSION_GRANTED);
        mServiceContext.setPermission(NETWORK_SETTINGS, PERMISSION_GRANTED);
        final NetworkRequest request = new NetworkRequest.Builder()
                .removeCapability(NET_CAPABILITY_NOT_VPN)
@@ -7266,8 +7312,7 @@ public class ConnectivityServiceTest {
        mServiceContext.setPermission(
                Manifest.permission.CONTROL_VPN, PERMISSION_GRANTED);
        // Necessary to see the UID ranges in NetworkCapabilities.
        mServiceContext.setPermission(
                Manifest.permission.NETWORK_SETTINGS, PERMISSION_GRANTED);
        mServiceContext.setPermission(NETWORK_SETTINGS, PERMISSION_GRANTED);
        final NetworkRequest request = new NetworkRequest.Builder()
                .removeCapability(NET_CAPABILITY_NOT_VPN)
@@ -7755,8 +7800,7 @@ public class ConnectivityServiceTest {
                Manifest.permission.CONTROL_ALWAYS_ON_VPN, PERMISSION_GRANTED);
        mServiceContext.setPermission(
                Manifest.permission.CONTROL_VPN, PERMISSION_GRANTED);
        mServiceContext.setPermission(
                Manifest.permission.NETWORK_SETTINGS, PERMISSION_GRANTED);
        mServiceContext.setPermission(NETWORK_SETTINGS, PERMISSION_GRANTED);
        final TestNetworkCallback callback = new TestNetworkCallback();
        final NetworkRequest request = new NetworkRequest.Builder()
@@ -7992,8 +8036,7 @@ public class ConnectivityServiceTest {
        mServiceContext.setPermission(
                Manifest.permission.CONTROL_VPN, PERMISSION_GRANTED);
        // For LockdownVpnTracker to call registerSystemDefaultNetworkCallback.
        mServiceContext.setPermission(
                Manifest.permission.NETWORK_SETTINGS, PERMISSION_GRANTED);
        mServiceContext.setPermission(NETWORK_SETTINGS, PERMISSION_GRANTED);
        final NetworkRequest request = new NetworkRequest.Builder().clearCapabilities().build();
        final TestNetworkCallback callback = new TestNetworkCallback();
@@ -9123,8 +9166,7 @@ public class ConnectivityServiceTest {
    private void denyAllLocationPrivilegedPermissions() {
        mServiceContext.setPermission(NetworkStack.PERMISSION_MAINLINE_NETWORK_STACK,
                PERMISSION_DENIED);
        mServiceContext.setPermission(Manifest.permission.NETWORK_SETTINGS,
                PERMISSION_DENIED);
        mServiceContext.setPermission(NETWORK_SETTINGS, PERMISSION_DENIED);
        mServiceContext.setPermission(Manifest.permission.NETWORK_STACK,
                PERMISSION_DENIED);
        mServiceContext.setPermission(Manifest.permission.NETWORK_SETUP_WIZARD,
@@ -9380,7 +9422,7 @@ public class ConnectivityServiceTest {
    @Test
    public void testCreateForCallerWithLocalMacAddressSanitizedWithSettingsPermission()
            throws Exception {
        mServiceContext.setPermission(Manifest.permission.NETWORK_SETTINGS, PERMISSION_GRANTED);
        mServiceContext.setPermission(NETWORK_SETTINGS, PERMISSION_GRANTED);
        final TransportInfo transportInfo = mock(TransportInfo.class);
        when(transportInfo.getApplicableRedactions())
@@ -10776,8 +10818,7 @@ public class ConnectivityServiceTest {
    private void registerDefaultNetworkCallbacks() {
        // Using Manifest.permission.NETWORK_SETTINGS for registerSystemDefaultNetworkCallback()
        mServiceContext.setPermission(
                Manifest.permission.NETWORK_SETTINGS, PERMISSION_GRANTED);
        mServiceContext.setPermission(NETWORK_SETTINGS, PERMISSION_GRANTED);
        mSystemDefaultNetworkCallback = new TestNetworkCallback();
        mDefaultNetworkCallback = new TestNetworkCallback();
        mProfileDefaultNetworkCallback = new TestNetworkCallback();
@@ -10787,8 +10828,7 @@ public class ConnectivityServiceTest {
        registerDefaultNetworkCallbackAsUid(mProfileDefaultNetworkCallback,
                TEST_WORK_PROFILE_APP_UID);
        // TODO: test using ConnectivityManager#registerDefaultNetworkCallbackAsUid as well.
        mServiceContext.setPermission(
                Manifest.permission.NETWORK_SETTINGS, PERMISSION_DENIED);
        mServiceContext.setPermission(NETWORK_SETTINGS, PERMISSION_DENIED);
    }
    private void unregisterDefaultNetworkCallbacks() {
@@ -10943,7 +10983,7 @@ public class ConnectivityServiceTest {
        defaultNetworkCallback.assertNoCallback();
        final TestNetworkCallback otherUidDefaultCallback = new TestNetworkCallback();
        withPermission(Manifest.permission.NETWORK_SETTINGS, () ->
        withPermission(NETWORK_SETTINGS, () ->
                mCm.registerDefaultNetworkCallbackAsUid(TEST_PACKAGE_UID, otherUidDefaultCallback,
                        new Handler(ConnectivityThread.getInstanceLooper())));
@@ -10991,7 +11031,7 @@ public class ConnectivityServiceTest {
        defaultNetworkCallback.assertNoCallback();
        final TestNetworkCallback otherUidDefaultCallback = new TestNetworkCallback();
        withPermission(Manifest.permission.NETWORK_SETTINGS, () ->
        withPermission(NETWORK_SETTINGS, () ->
                mCm.registerDefaultNetworkCallbackAsUid(TEST_PACKAGE_UID, otherUidDefaultCallback,
                        new Handler(ConnectivityThread.getInstanceLooper())));
@@ -11033,7 +11073,7 @@ public class ConnectivityServiceTest {
        defaultNetworkCallback.assertNoCallback();
        final TestNetworkCallback otherUidDefaultCallback = new TestNetworkCallback();
        withPermission(Manifest.permission.NETWORK_SETTINGS, () ->
        withPermission(NETWORK_SETTINGS, () ->
                mCm.registerDefaultNetworkCallbackAsUid(TEST_PACKAGE_UID, otherUidDefaultCallback,
                        new Handler(ConnectivityThread.getInstanceLooper())));