From 8397a84ea86f8fd46934afb4d258c99e4793a025 Mon Sep 17 00:00:00 2001 From: Chalard Jean Date: Wed, 23 May 2018 09:07:51 +0900 Subject: [PATCH] Fix a ConcurrentModificationException crash. This is a pinpoint fix against the bug listed below. While a client is synchronously reading the LinkProperties of a network, the ConnectivityServiceThread is updating its properties. Make sure that update is done atomically. This is a stopgap countermeasure against a problem that is pervasive with usage of LinkProperties, but fixing the problem itself will happen later. Bug: 80077223 Test: runtest frameworks-net Change-Id: I9302f8fb5303cb39aa82691d4f6d7f38707a41fa --- .../core/java/com/android/server/ConnectivityService.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/services/core/java/com/android/server/ConnectivityService.java b/services/core/java/com/android/server/ConnectivityService.java index f729cb84f6..e22a86e39d 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -4674,7 +4674,7 @@ public class ConnectivityService extends IConnectivityManager.Stub } private void updateLinkProperties(NetworkAgentInfo networkAgent, LinkProperties oldLp) { - LinkProperties newLp = networkAgent.linkProperties; + LinkProperties newLp = new LinkProperties(networkAgent.linkProperties); int netId = networkAgent.network.netId; // The NetworkAgentInfo does not know whether clatd is running on its network or not. Before @@ -4708,6 +4708,9 @@ public class ConnectivityService extends IConnectivityManager.Stub } // TODO - move this check to cover the whole function if (!Objects.equals(newLp, oldLp)) { + synchronized (networkAgent) { + networkAgent.linkProperties = newLp; + } notifyIfacesChangedForNetworkStats(); notifyNetworkCallbacks(networkAgent, ConnectivityManager.CALLBACK_IP_CHANGED); }