From 49f74a382bdd91809b6366d93deff21e715a3704 Mon Sep 17 00:00:00 2001 From: Paul Jensen Date: Wed, 17 Dec 2014 10:39:34 -0500 Subject: [PATCH] Clear process DNS NetID binding when expiring or releaseing legacy requests. When requests made by ConnectivityManager.startUsingNetworkFeature() are expired or are canceled via ConnectivityManager.stopUsingNetworkFeature(), we must remember to clear the binding of DNS requests from the calling process to the Network satisfying the request. bug:18778725 Change-Id: I800c808ac6486000241b5d263aa79a1192a9fe9e --- .../java/android/net/ConnectivityManager.java | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/core/java/android/net/ConnectivityManager.java b/core/java/android/net/ConnectivityManager.java index 17ee494622..cdc8661b16 100644 --- a/core/java/android/net/ConnectivityManager.java +++ b/core/java/android/net/ConnectivityManager.java @@ -933,10 +933,8 @@ public class ConnectivityManager { return -1; } - NetworkCallback networkCallback = removeRequestForFeature(netCap); - if (networkCallback != null) { + if (removeRequestForFeature(netCap)) { Log.d(TAG, "stopUsingNetworkFeature for " + networkType + ", " + feature); - unregisterNetworkCallback(networkCallback); } return 1; } @@ -1103,6 +1101,14 @@ public class ConnectivityManager { int expireSequenceNumber; Network currentNetwork; int delay = -1; + + private void clearDnsBinding() { + if (currentNetwork != null) { + currentNetwork = null; + setProcessDefaultNetworkForHostResolution(null); + } + } + NetworkCallback networkCallback = new NetworkCallback() { @Override public void onAvailable(Network network) { @@ -1112,10 +1118,7 @@ public class ConnectivityManager { } @Override public void onLost(Network network) { - if (network.equals(currentNetwork)) { - currentNetwork = null; - setProcessDefaultNetworkForHostResolution(null); - } + if (network.equals(currentNetwork)) clearDnsBinding(); Log.d(TAG, "startUsingNetworkFeature lost Network:" + network); } }; @@ -1144,10 +1147,7 @@ public class ConnectivityManager { LegacyRequest l = sLegacyRequests.get(netCap); if (l == null) return; ourSeqNum = l.expireSequenceNumber; - if (l.expireSequenceNumber == sequenceNum) { - unregisterNetworkCallback(l.networkCallback); - sLegacyRequests.remove(netCap); - } + if (l.expireSequenceNumber == sequenceNum) removeRequestForFeature(netCap); } Log.d(TAG, "expireRequest with " + ourSeqNum + ", " + sequenceNum); } @@ -1178,12 +1178,15 @@ public class ConnectivityManager { } } - private NetworkCallback removeRequestForFeature(NetworkCapabilities netCap) { + private boolean removeRequestForFeature(NetworkCapabilities netCap) { + final LegacyRequest l; synchronized (sLegacyRequests) { - LegacyRequest l = sLegacyRequests.remove(netCap); - if (l == null) return null; - return l.networkCallback; + l = sLegacyRequests.remove(netCap); } + if (l == null) return false; + unregisterNetworkCallback(l.networkCallback); + l.clearDnsBinding(); + return true; } /**