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
This commit is contained in:
Jean-Michel Trivi
2018-06-07 12:28:27 -07:00
parent c6e4acc222
commit c106d9f958

View File

@@ -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,