From 6dbaaf2d8a6eb169885454646fb12a8dd9a7ffac Mon Sep 17 00:00:00 2001 From: "Kyeongkab.Nam" Date: Tue, 6 Aug 2019 10:29:01 +0900 Subject: [PATCH] Fix a lock issue in AudioPortEventHandler It used "this" as a lock object to guard mListeners. but "this" is pointing to mHandler in handler thread. This causes the IndexOutOfBoundsException. bug: 138951761 Test: manual Change-Id: I826c7c68ecff4fc0d39addd3d56bc989e00848bc --- .../android/media/AudioPortEventHandler.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/media/java/android/media/AudioPortEventHandler.java b/media/java/android/media/AudioPortEventHandler.java index f9a4b1e90ad2a..6d9d6265f5e76 100644 --- a/media/java/android/media/AudioPortEventHandler.java +++ b/media/java/android/media/AudioPortEventHandler.java @@ -19,10 +19,12 @@ package android.media; import android.annotation.UnsupportedAppUsage; import android.os.Handler; import android.os.HandlerThread; -import android.os.Looper; import android.os.Message; -import java.util.ArrayList; + +import com.android.internal.annotations.GuardedBy; + import java.lang.ref.WeakReference; +import java.util.ArrayList; /** * The AudioPortEventHandler handles AudioManager.OnAudioPortUpdateListener callbacks @@ -33,6 +35,9 @@ import java.lang.ref.WeakReference; class AudioPortEventHandler { private Handler mHandler; private HandlerThread mHandlerThread; + private final Object mLock = new Object(); + + @GuardedBy("mLock") private final ArrayList mListeners = new ArrayList(); @@ -53,7 +58,7 @@ class AudioPortEventHandler { private long mJniCallback; void init() { - synchronized (this) { + synchronized (mLock) { if (mHandler != null) { return; } @@ -66,7 +71,7 @@ class AudioPortEventHandler { @Override public void handleMessage(Message msg) { ArrayList listeners; - synchronized (this) { + synchronized (mLock) { if (msg.what == AUDIOPORT_EVENT_NEW_LISTENER) { listeners = new ArrayList(); if (mListeners.contains(msg.obj)) { @@ -152,7 +157,7 @@ class AudioPortEventHandler { private native void native_finalize(); void registerListener(AudioManager.OnAudioPortUpdateListener l) { - synchronized (this) { + synchronized (mLock) { mListeners.add(l); } if (mHandler != null) { @@ -162,7 +167,7 @@ class AudioPortEventHandler { } void unregisterListener(AudioManager.OnAudioPortUpdateListener l) { - synchronized (this) { + synchronized (mLock) { mListeners.remove(l); } }