[PATCH 0/3] MR10828: winmm: Fix voicecom IMMDevice leak in device enumeration.
Reported by Alex Henrie. Fixes: 80542624ada14b152a6913cba13cfc6715edd878 -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10828
From: Matteo Bruni <mbruni@codeweavers.com> Reported by Alex Henrie. Fixes: 80542624ada14b152a6913cba13cfc6715edd878 --- dlls/winmm/waveform.c | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/dlls/winmm/waveform.c b/dlls/winmm/waveform.c index d017ccbed27..5b9134da696 100644 --- a/dlls/winmm/waveform.c +++ b/dlls/winmm/waveform.c @@ -497,11 +497,10 @@ static HRESULT WINMM_InitMMDevice(EDataFlow flow, IMMDevice *device, } static HRESULT WINMM_EnumDevices(WINMM_MMDevice **devices, - WINMM_MMDevice ***map, UINT *devcount, EDataFlow flow, + WINMM_MMDevice ***map, UINT *devcount, UINT *voicecom_id, EDataFlow flow, IMMDeviceEnumerator *devenum) { IMMDeviceCollection *devcoll; - UINT *voicecom_id; HRESULT hr; hr = IMMDeviceEnumerator_EnumAudioEndpoints(devenum, flow, @@ -515,7 +514,6 @@ static HRESULT WINMM_EnumDevices(WINMM_MMDevice **devices, return hr; } - voicecom_id = flow == eRender ? &g_out_voicecom_id : &g_in_voicecom_id; *voicecom_id = -1; if(*devcount > 0){ @@ -558,6 +556,7 @@ static HRESULT WINMM_EnumDevices(WINMM_MMDevice **devices, } } + IMMDevice_Release(voicecom_dev); IMMDevice_Release(def_dev); *devcount = count; @@ -791,7 +790,7 @@ static BOOL WINAPI WINMM_InitMMDevices(INIT_ONCE *once, void *param, void **cont if(FAILED(hr)) goto exit; - hr = WINMM_EnumDevices(&g_out_mmdevices, &g_out_map, &g_outmmdevices_count, + hr = WINMM_EnumDevices(&g_out_mmdevices, &g_out_map, &g_outmmdevices_count, &g_out_voicecom_id, eRender, g_devenum); if(FAILED(hr)){ g_outmmdevices_count = 0; @@ -799,7 +798,7 @@ static BOOL WINAPI WINMM_InitMMDevices(INIT_ONCE *once, void *param, void **cont goto exit; } - hr = WINMM_EnumDevices(&g_in_mmdevices, &g_in_map, &g_inmmdevices_count, + hr = WINMM_EnumDevices(&g_in_mmdevices, &g_in_map, &g_inmmdevices_count, &g_in_voicecom_id, eCapture, g_devenum); if(FAILED(hr)){ g_inmmdevices_count = 0; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10828
From: Matteo Bruni <mbruni@codeweavers.com> --- dlls/winmm/tests/capture.c | 22 +++++++++++++++++++++- dlls/winmm/tests/wave.c | 22 +++++++++++++++++++++- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/dlls/winmm/tests/capture.c b/dlls/winmm/tests/capture.c index f34d4314522..4800f15e53b 100644 --- a/dlls/winmm/tests/capture.c +++ b/dlls/winmm/tests/capture.c @@ -646,12 +646,12 @@ static void wave_in_test_device(UINT_PTR device) static void wave_in_tests(void) { + DWORD preferred, voicecom, status; WAVEINCAPSA capsA; WAVEINCAPSW capsW; WAVEFORMATEX format; HWAVEIN win; MMRESULT rc; - DWORD preferred, status; UINT ndev,d; ndev=waveInGetNumDevs(); @@ -677,6 +677,26 @@ static void wave_in_tests(void) ok(rc == MMSYSERR_INVALPARAM || rc == MMSYSERR_BADDEVICEID, /* w2008+wvista */ "waveInMessage(DRVM_MAPPER_PREFERRED_GET) failed: %u\n", rc); + rc = waveInMessage((HWAVEIN)WAVE_MAPPER, DRVM_MAPPER_CONSOLEVOICECOM_GET, + (DWORD_PTR)&voicecom, (DWORD_PTR)&status); + ok((ndev == 0 && (rc == MMSYSERR_NODRIVER || rc == MMSYSERR_BADDEVICEID)) || + rc == MMSYSERR_NOTSUPPORTED || + rc == MMSYSERR_NOERROR, "waveInMessage(DRVM_MAPPER_CONSOLEVOICECOM_GET) failed: %u\n", rc); + + if(rc != MMSYSERR_NOTSUPPORTED) + ok((ndev == 0 && (voicecom == -1 || broken(voicecom != -1))) || + voicecom < ndev, "Got invalid voicecom device: 0x%lx\n", voicecom); + + rc = waveInMessage((HWAVEIN)WAVE_MAPPER, DRVM_MAPPER_CONSOLEVOICECOM_GET, + (DWORD_PTR)-1, 0); + ok(rc == MMSYSERR_INVALPARAM || rc == MMSYSERR_BADDEVICEID, /* w2008+wvista */ + "waveInMessage(DRVM_MAPPER_CONSOLEVOICECOM_GET) failed: %u\n", rc); + + rc = waveInMessage((HWAVEIN)WAVE_MAPPER, DRVM_MAPPER_CONSOLEVOICECOM_GET, + 0, (DWORD_PTR)&status); + ok(rc == MMSYSERR_INVALPARAM || rc == MMSYSERR_BADDEVICEID, /* w2008+wvista */ + "waveInMessage(DRVM_MAPPER_CONSOLEVOICECOM_GET) failed: %u\n", rc); + rc=waveInGetDevCapsA(ndev+1,&capsA,sizeof(capsA)); ok(rc==MMSYSERR_BADDEVICEID, "waveInGetDevCapsA(%s): MMSYSERR_BADDEVICEID expected, got %s\n", diff --git a/dlls/winmm/tests/wave.c b/dlls/winmm/tests/wave.c index f6917799207..69563c1f3c4 100644 --- a/dlls/winmm/tests/wave.c +++ b/dlls/winmm/tests/wave.c @@ -1483,12 +1483,12 @@ static void wave_out_test_device(UINT_PTR device) static void wave_out_tests(void) { + DWORD preferred, voicecom, status; WAVEOUTCAPSA capsA; WAVEOUTCAPSW capsW; WAVEFORMATEX format; HWAVEOUT wout; MMRESULT rc; - DWORD preferred, status; UINT ndev,d; ndev=waveOutGetNumDevs(); @@ -1514,6 +1514,26 @@ static void wave_out_tests(void) ok(rc == MMSYSERR_INVALPARAM || rc == MMSYSERR_BADDEVICEID, /* w2008+wvista */ "waveOutMessage(DRVM_MAPPER_PREFERRED_GET) failed: %u\n", rc); + rc = waveOutMessage((HWAVEOUT)WAVE_MAPPER, DRVM_MAPPER_CONSOLEVOICECOM_GET, + (DWORD_PTR)&voicecom, (DWORD_PTR)&status); + ok((ndev == 0 && (rc == MMSYSERR_NODRIVER || rc == MMSYSERR_BADDEVICEID)) || + rc == MMSYSERR_NOTSUPPORTED || + rc == MMSYSERR_NOERROR, "waveOutMessage(DRVM_MAPPER_CONSOLEVOICECOM_GET) failed: %u\n", rc); + + if(rc != MMSYSERR_NOTSUPPORTED) + ok((ndev == 0 && (voicecom == -1 || broken(voicecom != -1))) || + voicecom < ndev, "Got invalid voicecom device: 0x%lx\n", voicecom); + + rc = waveOutMessage((HWAVEOUT)WAVE_MAPPER, DRVM_MAPPER_CONSOLEVOICECOM_GET, + (DWORD_PTR)-1, 0); + ok(rc == MMSYSERR_INVALPARAM || rc == MMSYSERR_BADDEVICEID, /* w2008+wvista */ + "waveOutMessage(DRVM_MAPPER_CONSOLEVOICECOM_GET) failed: %u\n", rc); + + rc = waveOutMessage((HWAVEOUT)WAVE_MAPPER, DRVM_MAPPER_CONSOLEVOICECOM_GET, + 0, (DWORD_PTR)&status); + ok(rc == MMSYSERR_INVALPARAM || rc == MMSYSERR_BADDEVICEID, /* w2008+wvista */ + "waveOutMessage(DRVM_MAPPER_CONSOLEVOICECOM_GET) failed: %u\n", rc); + rc=waveOutGetDevCapsA(ndev+1,&capsA,sizeof(capsA)); ok(rc==MMSYSERR_BADDEVICEID, "waveOutGetDevCapsA(%s): MMSYSERR_BADDEVICEID expected, got %s\n", -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10828
From: Matteo Bruni <mbruni@codeweavers.com> --- dlls/winmm/tests/capture.c | 2 +- dlls/winmm/tests/wave.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dlls/winmm/tests/capture.c b/dlls/winmm/tests/capture.c index 4800f15e53b..1a8bcbd8088 100644 --- a/dlls/winmm/tests/capture.c +++ b/dlls/winmm/tests/capture.c @@ -665,7 +665,7 @@ static void wave_in_tests(void) if(rc != MMSYSERR_NOTSUPPORTED) ok((ndev == 0 && (preferred == -1 || broken(preferred != -1))) || - preferred < ndev, "Got invalid preferred device: 0x%lx\n", preferred); + preferred == 0, "Got invalid preferred device: 0x%lx\n", preferred); rc = waveInMessage((HWAVEIN)WAVE_MAPPER, DRVM_MAPPER_PREFERRED_GET, (DWORD_PTR)-1 , 0); diff --git a/dlls/winmm/tests/wave.c b/dlls/winmm/tests/wave.c index 69563c1f3c4..09cf644b4c1 100644 --- a/dlls/winmm/tests/wave.c +++ b/dlls/winmm/tests/wave.c @@ -1502,7 +1502,7 @@ static void wave_out_tests(void) if(rc != MMSYSERR_NOTSUPPORTED) ok((ndev == 0 && (preferred == -1 || broken(preferred != -1))) || - preferred < ndev, "Got invalid preferred device: 0x%lx\n", preferred); + preferred == 0, "Got invalid preferred device: 0x%lx\n", preferred); rc = waveOutMessage((HWAVEOUT)WAVE_MAPPER, DRVM_MAPPER_PREFERRED_GET, (DWORD_PTR)-1 , 0); -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10828
This merge request was approved by Huw Davies. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10828
participants (3)
-
Huw Davies (@huw) -
Matteo Bruni -
Matteo Bruni (@Mystral)