From 221327dc05a2976e6a10733bb1f8d1befb9c4f3e Mon Sep 17 00:00:00 2001 From: Sundeep Ghuman Date: Tue, 2 May 2017 15:58:39 -0700 Subject: [PATCH] Fix Array Index out of bounds error. This error was caused by concurrent modification of the mPendingNotifications SparseIntArray which fell outside the synchronization block in copyAndNotifyListeners. Now the entire copyAndNotifyListeners is synchronized on mLock. Bug: b/37775443 Test: runtest --path frameworks/base/packages/SettingsLib/tests/integ/src/com/android/settingslib/wifi/WifiTrackerTest.java Change-Id: I19e8a4ecea5cd45122f4ca89f8ed959e500c951a --- .../com/android/settingslib/wifi/WifiTracker.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java index 646b6ba84ebb5..be15e657d1c37 100644 --- a/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java +++ b/packages/SettingsLib/src/com/android/settingslib/wifi/WifiTracker.java @@ -124,7 +124,8 @@ public class WifiTracker { */ private final Object mLock = new Object(); - //visible to both worker and main thread. Guarded by #mInternalAccessPoints + //visible to both worker and main thread. + @GuardedBy("mLock") private final AccessPointListenerAdapter mAccessPointListenerAdapter = new AccessPointListenerAdapter(); @@ -1005,12 +1006,13 @@ public class WifiTracker { if (DBG) { Log.d(TAG, "Starting to copy AP items on the MainHandler"); } - if (notifyListeners) { - notificationMap = mAccessPointListenerAdapter.mPendingNotifications.clone(); - } - - mAccessPointListenerAdapter.mPendingNotifications.clear(); synchronized (mLock) { + if (notifyListeners) { + notificationMap = mAccessPointListenerAdapter.mPendingNotifications.clone(); + } + + mAccessPointListenerAdapter.mPendingNotifications.clear(); + for (AccessPoint internalAccessPoint : mInternalAccessPoints) { AccessPoint accessPoint = oldAccessPoints.get(internalAccessPoint.mId); if (accessPoint == null) {