From 07bd4300e3b528278c7bdfb030499071ec26cffc Mon Sep 17 00:00:00 2001 From: Jean-Michel Trivi Date: Thu, 1 Jul 2021 16:02:31 -0700 Subject: [PATCH] AudioService: fix capture policy restoration Fix ConcurrentModificationException thrown during capture policy restoration. The code was retrieving the list of mappings from uid to capture policies (ALLOW_CAPTURE_*) to send them to AudioSystem. In case of failure, the capture policy was reset and thus modified the mapping list. Because the iteration happened on the same list it was trying to modify, an exception was thrown. The fix consists in iterating over a copy of the list of mappings instead of the actual list, a private field in the PlaybackMonitor class. Bug: 192496758 Test: atest AudioPlaybackCaptureTest, AudioPlaybackConfigurationTest Change-Id: I80afc28e5ddd8d389803306a7fa6da8f6fec3987 --- .../com/android/server/audio/PlaybackActivityMonitor.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java b/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java index af9a14ec80cd5..a13b2eb344d93 100644 --- a/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java +++ b/services/core/java/com/android/server/audio/PlaybackActivityMonitor.java @@ -380,10 +380,12 @@ public final class PlaybackActivityMonitor } /** - * Return all cached capture policies. + * Return a copy of all cached capture policies. */ public HashMap getAllAllowedCapturePolicies() { - return mAllowedCapturePolicies; + synchronized (mAllowedCapturePolicies) { + return (HashMap) mAllowedCapturePolicies.clone(); + } } private void updateAllowedCapturePolicy(AudioPlaybackConfiguration apc, int capturePolicy) {