From 07dc18662abd0794103e41812e9b675bfc44bff0 Mon Sep 17 00:00:00 2001 From: Chalard Jean Date: Mon, 1 Mar 2021 22:08:57 +0900 Subject: [PATCH] Fix a bug where UID ranges would not be removed MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When a new preferences object is sent that no longer contains a particular app, a new set of requests will be generated. All requests corresponding to that app will be unregistered, and no new ones will be filed since the preferences no longer contain that app. The place where the UID ranges are removed however is in makeDefaultForApps(), which takes a request. As there no longer is a default request for this app, makeDefaultForApps() will never be called with a request for it, and the UID ranges will never be removed. This change applies an emergency fix with some side effects when setting a new preference. This is acceptable, but should ideally be fixed ; see TODO in the code for details. Test: FrameworksNetTests Test: TODO : Need a unit test for this Change-Id: Iac3f55af5d00d174460e1d4cdd31f581835dbaa6 --- .../android/server/ConnectivityService.java | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index b825abb396..12b094eaee 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -3831,7 +3831,24 @@ public class ConnectivityService extends IConnectivityManager.Stub removeListenRequestFromNetworks(req); } } - mDefaultNetworkRequests.remove(nri); + if (mDefaultNetworkRequests.remove(nri)) { + // If this request was one of the defaults, then the UID rules need to be updated + // WARNING : if the app(s) for which this network request is the default are doing + // traffic, this will kill their connected sockets, even if an equivalent request + // is going to be reinstated right away ; unconnected traffic will go on the default + // until the new default is set, which will happen very soon. + // TODO : The only way out of this is to diff old defaults and new defaults, and only + // remove ranges for those requests that won't have a replacement + final NetworkAgentInfo satisfier = nri.getSatisfier(); + if (null != satisfier) { + try { + mNetd.networkRemoveUidRanges(satisfier.network.getNetId(), + toUidRangeStableParcels(nri.getUids())); + } catch (RemoteException e) { + loge("Exception setting network preference default network", e); + } + } + } mNetworkRequestCounter.decrementCount(nri.mUid); mNetworkRequestInfoLogs.log("RELEASE " + nri);