Revert "Always disconnect agents immediately."

This reverts commit 4bc9fa6b8c.

Reason for revert: b/288450518

Some iterations over mNetworkAgentInfos result in networks being
disconnected, which removes them from mNetworkAgentInfos during
iteration. This crashes with NPE or OOB exceptions.

Bug: 286649301
Bug: 288149251
Bug: 288450518
Change-Id: I6e0b5b614d9e88267db77cb807ae4bf09f88c0f6
This commit is contained in:
Jean Chalard
2023-06-27 08:54:23 +00:00
committed by Chalard Jean
parent 03aabc0d78
commit 3160bc0825
3 changed files with 16 additions and 23 deletions

View File

@@ -318,6 +318,7 @@ import java.io.IOException;
import java.io.InterruptedIOException;
import java.io.PrintWriter;
import java.io.Writer;
import java.lang.IllegalArgumentException;
import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.InetSocketAddress;
@@ -4010,7 +4011,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
// the destroyed flag is only just above the "current satisfier wins"
// tie-breaker. But technically anything that affects scoring should rematch.
rematchAllNetworksAndRequests();
mHandler.postDelayed(() -> disconnectAndDestroyNetwork(nai), timeoutMs);
mHandler.postDelayed(() -> nai.disconnect(), timeoutMs);
break;
}
}
@@ -4609,9 +4610,6 @@ public class ConnectivityService extends IConnectivityManager.Stub
if (DBG) {
log(nai.toShortString() + " disconnected, was satisfying " + nai.numNetworkRequests());
}
nai.disconnect();
// Clear all notifications of this network.
mNotifier.clearNotification(nai.network.getNetId());
// A network agent has disconnected.
@@ -5897,7 +5895,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
final NetworkAgentInfo nai = getNetworkAgentInfoForNetwork((Network) msg.obj);
if (nai == null) break;
nai.onPreventAutomaticReconnect();
disconnectAndDestroyNetwork(nai);
nai.disconnect();
break;
case EVENT_SET_VPN_NETWORK_PREFERENCE:
handleSetVpnNetworkPreference((VpnNetworkPreferenceInfo) msg.obj);
@@ -9042,7 +9040,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
break;
}
}
disconnectAndDestroyNetwork(nai);
nai.disconnect();
}
private void handleLingerComplete(NetworkAgentInfo oldNetwork) {
@@ -9584,10 +9582,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
updateLegacyTypeTrackerAndVpnLockdownForRematch(changes, nais);
// Tear down all unneeded networks.
// Iterate in reverse order because teardownUnneededNetwork removes the nai from
// mNetworkAgentInfos.
for (int i = mNetworkAgentInfos.size() - 1; i >= 0; i--) {
final NetworkAgentInfo nai = mNetworkAgentInfos.valueAt(i);
for (NetworkAgentInfo nai : mNetworkAgentInfos) {
if (unneeded(nai, UnneededFor.TEARDOWN)) {
if (nai.getInactivityExpiry() > 0) {
// This network has active linger timers and no requests, but is not
@@ -9985,6 +9980,7 @@ public class ConnectivityService extends IConnectivityManager.Stub
// This has to happen after matching the requests, because callbacks are just requests.
notifyNetworkCallbacks(networkAgent, ConnectivityManager.CALLBACK_PRECHECK);
} else if (state == NetworkInfo.State.DISCONNECTED) {
networkAgent.disconnect();
if (networkAgent.isVPN()) {
updateVpnUids(networkAgent, networkAgent.networkCapabilities, null);
}