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
This commit is contained in:
Paul Jensen
2014-12-17 10:39:34 -05:00
parent 70116ce13c
commit 49f74a382b

View File

@@ -933,10 +933,8 @@ public class ConnectivityManager {
return -1; return -1;
} }
NetworkCallback networkCallback = removeRequestForFeature(netCap); if (removeRequestForFeature(netCap)) {
if (networkCallback != null) {
Log.d(TAG, "stopUsingNetworkFeature for " + networkType + ", " + feature); Log.d(TAG, "stopUsingNetworkFeature for " + networkType + ", " + feature);
unregisterNetworkCallback(networkCallback);
} }
return 1; return 1;
} }
@@ -1103,6 +1101,14 @@ public class ConnectivityManager {
int expireSequenceNumber; int expireSequenceNumber;
Network currentNetwork; Network currentNetwork;
int delay = -1; int delay = -1;
private void clearDnsBinding() {
if (currentNetwork != null) {
currentNetwork = null;
setProcessDefaultNetworkForHostResolution(null);
}
}
NetworkCallback networkCallback = new NetworkCallback() { NetworkCallback networkCallback = new NetworkCallback() {
@Override @Override
public void onAvailable(Network network) { public void onAvailable(Network network) {
@@ -1112,10 +1118,7 @@ public class ConnectivityManager {
} }
@Override @Override
public void onLost(Network network) { public void onLost(Network network) {
if (network.equals(currentNetwork)) { if (network.equals(currentNetwork)) clearDnsBinding();
currentNetwork = null;
setProcessDefaultNetworkForHostResolution(null);
}
Log.d(TAG, "startUsingNetworkFeature lost Network:" + network); Log.d(TAG, "startUsingNetworkFeature lost Network:" + network);
} }
}; };
@@ -1144,10 +1147,7 @@ public class ConnectivityManager {
LegacyRequest l = sLegacyRequests.get(netCap); LegacyRequest l = sLegacyRequests.get(netCap);
if (l == null) return; if (l == null) return;
ourSeqNum = l.expireSequenceNumber; ourSeqNum = l.expireSequenceNumber;
if (l.expireSequenceNumber == sequenceNum) { if (l.expireSequenceNumber == sequenceNum) removeRequestForFeature(netCap);
unregisterNetworkCallback(l.networkCallback);
sLegacyRequests.remove(netCap);
}
} }
Log.d(TAG, "expireRequest with " + ourSeqNum + ", " + sequenceNum); 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) { synchronized (sLegacyRequests) {
LegacyRequest l = sLegacyRequests.remove(netCap); l = sLegacyRequests.remove(netCap);
if (l == null) return null;
return l.networkCallback;
} }
if (l == null) return false;
unregisterNetworkCallback(l.networkCallback);
l.clearDnsBinding();
return true;
} }
/** /**