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
diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java
index 3fd69ee..db5f7ed 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 @@
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 @@
synchronized(mSettingsLock) {
change = mRingerMode != ringerMode;
mRingerMode = ringerMode;
+ muteRingerModeStreams();
}
- muteRingerModeStreams();
-
// Post a persist ringer mode msg
if (persist) {
sendMsg(mAudioHandler, MSG_PERSIST_RINGER_MODE,