diff options
author | Jean-Michel Trivi <jmtrivi@google.com> | 2018-06-07 12:28:27 -0700 |
---|---|---|
committer | android-build-team Robot <android-build-team-robot@google.com> | 2018-06-12 01:48:42 +0000 |
commit | 18424bb7a480883ac54d30303cbbe257e7edf712 (patch) | |
tree | 6ad40fdae670eb1bb05f257d4da48b37bd0bfc36 | |
parent | b96cfb97ac9b5928673e8f348cb406f46c237d71 (diff) | |
download | base-18424bb7a480883ac54d30303cbbe257e7edf712.tar.gz |
AudioService: fix deallock setBluetoothScoOn vs setMode
In AudioService:
setBluetoothScoOn()
> setBluetoothScoOnInt()
> synchronized(mSettingsLock)
> muteRingerModeStreams()
> synchronized (VolumeStreamState.class)
vs
setMode()
> setModeInt()
> synchronized (mSettingsLock)
> synchronized (VolumeStreamState.class)
The issue comes from setBluetoothScoOnInt() releasing the lock
on mSettingsLock before calling muteRingerModeStreams(). This
breaks the expected lock ordering in AudioService, where
mSettingsLock must be locked before VolumeStreamState.class.
Bug: 109746821
Test: see bug
Change-Id: I853ca60781efc506626b6345f27da701655ac359
(cherry picked from commit c106d9f958be76ab14a6724525f39bc3fec03fd2)
-rw-r--r-- | services/core/java/com/android/server/audio/AudioService.java | 4 |
1 files changed, 2 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 3fd69ee5645c..db5f7ed7cc8a 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -2623,6 +2623,7 @@ public class AudioService extends IAudioService.Stub broadcastRingerMode(AudioManager.RINGER_MODE_CHANGED_ACTION, ringerMode); } + @GuardedBy("mSettingsLock") private void muteRingerModeStreams() { // Mute stream if not previously muted by ringer mode and (ringer mode // is not RINGER_MODE_NORMAL OR stream is zen muted) and stream is affected by ringer mode. @@ -2710,10 +2711,9 @@ public class AudioService extends IAudioService.Stub synchronized(mSettingsLock) { change = mRingerMode != ringerMode; mRingerMode = ringerMode; + muteRingerModeStreams(); } - muteRingerModeStreams(); - // Post a persist ringer mode msg if (persist) { sendMsg(mAudioHandler, MSG_PERSIST_RINGER_MODE, |