[PATCH 2/2] winemm: Pass the device to WINMM_Pause to prevent a possible deadlock (Coverity).
Sven Baars
sven.wine at gmail.com
Mon Oct 21 16:49:50 CDT 2019
Signed-off-by: Sven Baars <sven.wine at gmail.com>
---
dlls/winmm/waveform.c | 27 ++++++++++++++++-----------
1 file changed, 16 insertions(+), 11 deletions(-)
diff --git a/dlls/winmm/waveform.c b/dlls/winmm/waveform.c
index 11a5cad601..b08768577b 100644
--- a/dlls/winmm/waveform.c
+++ b/dlls/winmm/waveform.c
@@ -1966,27 +1966,20 @@ static MMRESULT WINMM_BeginPlaying(WINMM_Device *device)
return MMSYSERR_NOERROR;
}
-static LRESULT WINMM_Pause(HWAVE hwave)
+static LRESULT WINMM_Pause(WINMM_Device *device)
{
- WINMM_Device *device = WINMM_GetDeviceFromHWAVE(hwave);
HRESULT hr;
- TRACE("(%p)\n", hwave);
-
- if(!WINMM_ValidateAndLock(device))
- return MMSYSERR_INVALHANDLE;
+ TRACE("(%p)\n", device->handle);
hr = IAudioClient_Stop(device->client);
if(FAILED(hr)){
- LeaveCriticalSection(&device->lock);
WARN("Stop failed: %08x\n", hr);
return MMSYSERR_ERROR;
}
device->stopped = FALSE;
- LeaveCriticalSection(&device->lock);
-
return MMSYSERR_NOERROR;
}
@@ -2939,9 +2932,21 @@ UINT WINAPI waveOutBreakLoop(HWAVEOUT hWaveOut)
*/
UINT WINAPI waveOutPause(HWAVEOUT hWaveOut)
{
+ WINMM_Device *device;
+ MMRESULT mr;
+
TRACE("(%p)\n", hWaveOut);
- return WINMM_Pause((HWAVE)hWaveOut);
+ device = WINMM_GetDeviceFromHWAVE((HWAVE)hWaveOut);
+
+ if(!WINMM_ValidateAndLock(device))
+ return MMSYSERR_INVALHANDLE;
+
+ mr = WINMM_Pause(device);
+
+ LeaveCriticalSection(&device->lock);
+
+ return mr;
}
/**************************************************************************
@@ -3573,7 +3578,7 @@ UINT WINAPI waveInStop(HWAVEIN hWaveIn)
if(!WINMM_ValidateAndLock(device))
return MMSYSERR_INVALHANDLE;
- hr = WINMM_Pause((HWAVE)hWaveIn);
+ hr = WINMM_Pause(device);
if(FAILED(hr)){
LeaveCriticalSection(&device->lock);
return MMSYSERR_ERROR;
--
2.17.1
More information about the wine-devel
mailing list