Huw Davies : winealsa: Don't acquire the sessions lock after the client lock.
Alexandre Julliard
julliard at winehq.org
Fri Dec 3 15:18:59 CST 2021
Module: wine
Branch: master
Commit: 1acba9d959377074110cc05a74e47f9af3f5005d
URL: https://source.winehq.org/git/wine.git/?a=commit;h=1acba9d959377074110cc05a74e47f9af3f5005d
Author: Huw Davies <huw at codeweavers.com>
Date: Thu Dec 2 12:02:38 2021 +0000
winealsa: Don't acquire the sessions lock after the client lock.
This could lead to a deadlock with AudioSessionControl_GetState()
which acquires the locks in the other order.
Signed-off-by: Huw Davies <huw at codeweavers.com>
Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/winealsa.drv/mmdevdrv.c | 11 ++++-------
1 file changed, 4 insertions(+), 7 deletions(-)
diff --git a/dlls/winealsa.drv/mmdevdrv.c b/dlls/winealsa.drv/mmdevdrv.c
index 7f25cdcce1b..5aa1b4aab63 100644
--- a/dlls/winealsa.drv/mmdevdrv.c
+++ b/dlls/winealsa.drv/mmdevdrv.c
@@ -1344,10 +1344,12 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface,
}
}
+ EnterCriticalSection(&g_sessions_lock);
EnterCriticalSection(&This->lock);
if(This->initted){
LeaveCriticalSection(&This->lock);
+ LeaveCriticalSection(&g_sessions_lock);
return AUDCLNT_E_ALREADY_INITIALIZED;
}
@@ -1537,19 +1539,13 @@ static HRESULT WINAPI AudioClient_Initialize(IAudioClient3 *iface,
This->share = mode;
This->flags = flags;
- EnterCriticalSection(&g_sessions_lock);
-
hr = get_audio_session(sessionguid, This->parent, fmt->nChannels,
&This->session);
- if(FAILED(hr)){
- LeaveCriticalSection(&g_sessions_lock);
+ if(FAILED(hr))
goto exit;
- }
list_add_tail(&This->session->clients, &This->entry);
- LeaveCriticalSection(&g_sessions_lock);
-
This->initted = TRUE;
TRACE("ALSA period: %lu frames\n", This->alsa_period_frames);
@@ -1569,6 +1565,7 @@ exit:
}
LeaveCriticalSection(&This->lock);
+ LeaveCriticalSection(&g_sessions_lock);
return hr;
}
More information about the wine-cvs
mailing list