[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