From acace94c1739b08ea72dc6c2f49cf29bce6c1dac Mon Sep 17 00:00:00 2001 From: Jorim Jaggi Date: Fri, 28 Aug 2015 11:46:10 -0700 Subject: Fix race condition by guarding callbacks Bug: 23587553 Change-Id: Ia71760013f3acbb5aeb4e30bb716683c9c672742 --- .../statusbar/policy/SecurityControllerImpl.java | 28 ++++++++++++++-------- 1 file changed, 18 insertions(+), 10 deletions(-) (limited to 'packages/SystemUI') diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java index 6af9854..1595d0d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/SecurityControllerImpl.java @@ -36,6 +36,7 @@ import android.text.TextUtils; import android.util.Log; import android.util.SparseArray; +import com.android.internal.annotations.GuardedBy; import com.android.internal.net.LegacyVpnInfo; import com.android.internal.net.VpnConfig; import com.android.internal.net.VpnInfo; @@ -62,8 +63,9 @@ public class SecurityControllerImpl implements SecurityController { private final IConnectivityManager mConnectivityManagerService; private final DevicePolicyManager mDevicePolicyManager; private final UserManager mUserManager; - private final ArrayList mCallbacks - = new ArrayList(); + + @GuardedBy("mCallbacks") + private final ArrayList mCallbacks = new ArrayList<>(); private SparseArray mCurrentVpns = new SparseArray<>(); private int mCurrentUserId; @@ -161,16 +163,20 @@ public class SecurityControllerImpl implements SecurityController { @Override public void removeCallback(SecurityControllerCallback callback) { - if (callback == null) return; - if (DEBUG) Log.d(TAG, "removeCallback " + callback); - mCallbacks.remove(callback); + synchronized (mCallbacks) { + if (callback == null) return; + if (DEBUG) Log.d(TAG, "removeCallback " + callback); + mCallbacks.remove(callback); + } } @Override public void addCallback(SecurityControllerCallback callback) { - if (callback == null || mCallbacks.contains(callback)) return; - if (DEBUG) Log.d(TAG, "addCallback " + callback); - mCallbacks.add(callback); + synchronized (mCallbacks) { + if (callback == null || mCallbacks.contains(callback)) return; + if (DEBUG) Log.d(TAG, "addCallback " + callback); + mCallbacks.add(callback); + } } @Override @@ -202,8 +208,10 @@ public class SecurityControllerImpl implements SecurityController { } private void fireCallbacks() { - for (SecurityControllerCallback callback : mCallbacks) { - callback.onStateChanged(); + synchronized (mCallbacks) { + for (SecurityControllerCallback callback : mCallbacks) { + callback.onStateChanged(); + } } } -- cgit v1.1