Merge changes Ide2567b2,I0ee0ce92,Iac3f55af

* changes:
  Fix a bug where callbacks would see blips
  Fix a bug where a request would not be refcounted
  Fix a bug where UID ranges would not be removed
This commit is contained in:
Chalard Jean
2021-03-04 13:12:20 +00:00
committed by Gerrit Code Review

View File

@@ -3831,7 +3831,24 @@ public class ConnectivityService extends IConnectivityManager.Stub
removeListenRequestFromNetworks(req); 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); mNetworkRequestCounter.decrementCount(nri.mUid);
mNetworkRequestInfoLogs.log("RELEASE " + nri); mNetworkRequestInfoLogs.log("RELEASE " + nri);
@@ -5237,11 +5254,20 @@ public class ConnectivityService extends IConnectivityManager.Stub
ensureAllNetworkRequestsHaveType(r); ensureAllNetworkRequestsHaveType(r);
mRequests = initializeRequests(r); mRequests = initializeRequests(r);
mNetworkRequestForCallback = nri.getNetworkRequestForCallback(); mNetworkRequestForCallback = nri.getNetworkRequestForCallback();
// Note here that the satisfier may have corresponded to an old request, that
// this code doesn't try to take over. While it is a small discrepancy in the
// structure of these requests, it will be fixed by the next rematch and it's
// not as bad as having an NRI not storing its real satisfier.
// Fixing this discrepancy would require figuring out in the copying code what
// is the new request satisfied by this, which is a bit complex and not very
// useful as no code is using it until rematch fixes it.
mSatisfier = nri.mSatisfier;
mMessenger = nri.mMessenger; mMessenger = nri.mMessenger;
mBinder = nri.mBinder; mBinder = nri.mBinder;
mPid = nri.mPid; mPid = nri.mPid;
mUid = nri.mUid; mUid = nri.mUid;
mPendingIntent = nri.mPendingIntent; mPendingIntent = nri.mPendingIntent;
mNetworkRequestCounter.incrementCountOrThrow(mUid);
mCallingAttributionTag = nri.mCallingAttributionTag; mCallingAttributionTag = nri.mCallingAttributionTag;
} }
@@ -7201,13 +7227,13 @@ public class ConnectivityService extends IConnectivityManager.Stub
private static class NetworkReassignment { private static class NetworkReassignment {
static class RequestReassignment { static class RequestReassignment {
@NonNull public final NetworkRequestInfo mNetworkRequestInfo; @NonNull public final NetworkRequestInfo mNetworkRequestInfo;
@NonNull public final NetworkRequest mOldNetworkRequest; @Nullable public final NetworkRequest mOldNetworkRequest;
@NonNull public final NetworkRequest mNewNetworkRequest; @Nullable public final NetworkRequest mNewNetworkRequest;
@Nullable public final NetworkAgentInfo mOldNetwork; @Nullable public final NetworkAgentInfo mOldNetwork;
@Nullable public final NetworkAgentInfo mNewNetwork; @Nullable public final NetworkAgentInfo mNewNetwork;
RequestReassignment(@NonNull final NetworkRequestInfo networkRequestInfo, RequestReassignment(@NonNull final NetworkRequestInfo networkRequestInfo,
@NonNull final NetworkRequest oldNetworkRequest, @Nullable final NetworkRequest oldNetworkRequest,
@NonNull final NetworkRequest newNetworkRequest, @Nullable final NetworkRequest newNetworkRequest,
@Nullable final NetworkAgentInfo oldNetwork, @Nullable final NetworkAgentInfo oldNetwork,
@Nullable final NetworkAgentInfo newNetwork) { @Nullable final NetworkAgentInfo newNetwork) {
mNetworkRequestInfo = networkRequestInfo; mNetworkRequestInfo = networkRequestInfo;
@@ -7280,14 +7306,14 @@ public class ConnectivityService extends IConnectivityManager.Stub
} }
private void updateSatisfiersForRematchRequest(@NonNull final NetworkRequestInfo nri, private void updateSatisfiersForRematchRequest(@NonNull final NetworkRequestInfo nri,
@NonNull final NetworkRequest previousRequest, @Nullable final NetworkRequest previousRequest,
@NonNull final NetworkRequest newRequest, @Nullable final NetworkRequest newRequest,
@Nullable final NetworkAgentInfo previousSatisfier, @Nullable final NetworkAgentInfo previousSatisfier,
@Nullable final NetworkAgentInfo newSatisfier, @Nullable final NetworkAgentInfo newSatisfier,
final long now) { final long now) {
if (null != newSatisfier && mNoServiceNetwork != newSatisfier) { if (null != newSatisfier && mNoServiceNetwork != newSatisfier) {
if (VDBG) log("rematch for " + newSatisfier.toShortString()); if (VDBG) log("rematch for " + newSatisfier.toShortString());
if (null != previousSatisfier && mNoServiceNetwork != previousSatisfier) { if (null != previousRequest && null != previousSatisfier) {
if (VDBG || DDBG) { if (VDBG || DDBG) {
log(" accepting network in place of " + previousSatisfier.toShortString()); log(" accepting network in place of " + previousSatisfier.toShortString());
} }
@@ -7310,7 +7336,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
Log.wtf(TAG, "BUG: " + newSatisfier.toShortString() + " already has " Log.wtf(TAG, "BUG: " + newSatisfier.toShortString() + " already has "
+ newRequest); + newRequest);
} }
} else if (null != previousSatisfier) { } else if (null != previousRequest && null != previousSatisfier) {
if (DBG) { if (DBG) {
log("Network " + previousSatisfier.toShortString() + " stopped satisfying" log("Network " + previousSatisfier.toShortString() + " stopped satisfying"
+ " request " + previousRequest.requestId); + " request " + previousRequest.requestId);