From 8cfa434e53cdb7d95809fc0e10bb834f9146503f 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. Clean cherry-pick of ag/4174798 Bug: 80077223 Test: runtest frameworks-net Change-Id: I61b262d824c98b4ced36395a597b73de9193a199 Merged-In: I25007ac26349e451bb47f966af70d590d699c347 Merged-In: I03526187645b6955eb89ca4d2e4a930ebac236b8 --- .../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 fe0f6d23b1..789092d1cf 100644 --- a/services/core/java/com/android/server/ConnectivityService.java +++ b/services/core/java/com/android/server/ConnectivityService.java @@ -4630,7 +4630,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 @@ -4664,6 +4664,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); }