summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjunyulai <junyulai@google.com>2019-05-13 14:19:00 +0800
committerjunyulai <junyulai@google.com>2019-05-13 14:48:41 +0800
commitcf43dbdbc69e5cb36ba874d21511a76240069abc (patch)
tree9e22a377faef4373aa90696821c4a476b42b4e92
parentce5ecd93044754cafcdf6ca5e1348527ad57dcb2 (diff)
downloadbase-cf43dbdbc69e5cb36ba874d21511a76240069abc.tar.gz
Fix concurrent modification exception in KeepaliveTracker
In aosp/951200, the clean up function delete the item in the hash map that holds the record while iterating it, where the list used to iterate the records is backed by the hash map, so changes to the map are reflected in the list and caused the concurrent modification exception. Bug: 132341736 Test: 1. atest com.android.server.ConnectivityServiceTest \ #testNattSocketKeepalives --generate-new-metrics 300 2. atest FrameworksNetTests --generate-new-metrics 10 Change-Id: I0481a469ee23231e5f0ab738a06b5e09f6cdb680
-rw-r--r--services/core/java/com/android/server/connectivity/KeepaliveTracker.java5
1 files changed, 3 insertions, 2 deletions
diff --git a/services/core/java/com/android/server/connectivity/KeepaliveTracker.java b/services/core/java/com/android/server/connectivity/KeepaliveTracker.java
index 526b4ffabb52..e10d7373359b 100644
--- a/services/core/java/com/android/server/connectivity/KeepaliveTracker.java
+++ b/services/core/java/com/android/server/connectivity/KeepaliveTracker.java
@@ -462,9 +462,10 @@ public class KeepaliveTracker {
}
public void handleStopAllKeepalives(NetworkAgentInfo nai, int reason) {
- HashMap <Integer, KeepaliveInfo> networkKeepalives = mKeepalives.get(nai);
+ final HashMap<Integer, KeepaliveInfo> networkKeepalives = mKeepalives.get(nai);
if (networkKeepalives != null) {
- for (KeepaliveInfo ki : networkKeepalives.values()) {
+ final ArrayList<KeepaliveInfo> kalist = new ArrayList(networkKeepalives.values());
+ for (KeepaliveInfo ki : kalist) {
ki.stop(reason);
// Clean up keepalives since the network agent is disconnected and unable to pass
// back asynchronous result of stop().