[PATCH 1/2] winealsa: Don't acquire the sessions lock after the client lock.
Andrew Eikum
aeikum at codeweavers.com
Fri Dec 3 09:15:43 CST 2021
Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
On Thu, Dec 02, 2021 at 12:02:38PM +0000, Huw Davies wrote:
> 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>
> ---
> 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;
> }
> --
> 2.23.0
>
>
More information about the wine-devel
mailing list