From f85e77863e2d3c5e5747116ce2a20c40a38fe02f Mon Sep 17 00:00:00 2001 From: Atneya Nair Date: Tue, 26 Jul 2022 15:24:16 -0700 Subject: [PATCH] Prevent modifying mAudioPolicies during iteration Calling release on a policy from mAudioPolicies removes a key from the map, causing a ConcurrentHashException. Defer releases till after iteration completes. Test: Compiles Bug: 240314224 Change-Id: I83fa969204d8a9c6ac7bae40f5be57a92813f6be (cherry picked from commit 6f837517a2a9106deac7bb076db1cf78f72e0438) Merged-In: I83fa969204d8a9c6ac7bae40f5be57a92813f6be --- .../core/java/com/android/server/audio/AudioService.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index a51b187e8634..56874f74afb1 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -1517,6 +1517,7 @@ public class AudioService extends IAudioService.Stub } synchronized (mAudioPolicies) { + ArrayList invalidProxies = new ArrayList<>(); for (AudioPolicyProxy policy : mAudioPolicies.values()) { final int status = policy.connectMixes(); if (status != AudioSystem.SUCCESS) { @@ -1524,7 +1525,7 @@ public class AudioService extends IAudioService.Stub Log.e(TAG, "onAudioServerDied: error " + AudioSystem.audioSystemErrorToString(status) + " when connecting mixes for policy " + policy.toLogFriendlyString()); - policy.release(); + invalidProxies.add(policy); } else { final int deviceAffinitiesStatus = policy.setupDeviceAffinities(); if (deviceAffinitiesStatus != AudioSystem.SUCCESS) { @@ -1532,10 +1533,12 @@ public class AudioService extends IAudioService.Stub + AudioSystem.audioSystemErrorToString(deviceAffinitiesStatus) + " when connecting device affinities for policy " + policy.toLogFriendlyString()); - policy.release(); + invalidProxies.add(policy); } } } + invalidProxies.forEach((policy) -> policy.release()); + } // Restore capture policies