[PATCH 0/1] MR10158: winmm: Return MMSYSERR_INVALPARAM for NULL lpFormat in waveOutOpen.
On startup, a thread in the game "GAG: The Impotent Mystery" calls waveOutOpen with a NULL lpFormat. This appears to be an application bug that is harmless on Windows but results in a crash on Wine. Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=49393 -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10158
From: Andrew Nguyen <arethusa26@gmail.com> Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=49393 --- dlls/winmm/tests/wave.c | 17 +++++++++++++++++ dlls/winmm/waveform.c | 3 +++ 2 files changed, 20 insertions(+) diff --git a/dlls/winmm/tests/wave.c b/dlls/winmm/tests/wave.c index b2f3dd31c16..3846fad0908 100644 --- a/dlls/winmm/tests/wave.c +++ b/dlls/winmm/tests/wave.c @@ -865,6 +865,14 @@ EXIT: free(frags); } +static void CALLBACK no_message_callback_func(HWAVEOUT hwo, UINT uMsg, + DWORD_PTR dwInstance, + DWORD_PTR dwParam1, + DWORD_PTR dwParam2) +{ + ok(FALSE, "Received message %x when none is expected\n", uMsg); +} + static void wave_out_test_device(UINT_PTR device) { WAVEOUTCAPSA capsA; @@ -1440,6 +1448,15 @@ static void wave_out_test_device(UINT_PTR device) dev_name(device)); /* Test invalid parameters */ + rc = waveOutOpen(&wout, device, NULL, (DWORD_PTR)no_message_callback_func, 0, + CALLBACK_FUNCTION); + ok(rc == MMSYSERR_INVALPARAM, + "waveOutOpen(%s): returned %s\n",dev_name(device),wave_out_error(rc)); + + rc = waveOutOpen(&wout, device, NULL, (DWORD_PTR)no_message_callback_func, 0, + CALLBACK_FUNCTION | WAVE_FORMAT_QUERY); + ok(rc == MMSYSERR_INVALPARAM, + "waveOutOpen(%s): returned %s\n",dev_name(device),wave_out_error(rc)); format.wFormatTag = WAVE_FORMAT_PCM; format.nChannels = 1; diff --git a/dlls/winmm/waveform.c b/dlls/winmm/waveform.c index fa1c446ff91..78fb70d3c18 100644 --- a/dlls/winmm/waveform.c +++ b/dlls/winmm/waveform.c @@ -2729,6 +2729,9 @@ MMRESULT WINAPI waveOutOpen(LPHWAVEOUT lphWaveOut, UINT uDeviceID, if(!lphWaveOut && !(dwFlags & WAVE_FORMAT_QUERY)) return MMSYSERR_INVALPARAM; + if(!lpFormat) + return MMSYSERR_INVALPARAM; + res = WINMM_CheckCallback(dwCallback, dwFlags, FALSE); if(res != MMSYSERR_NOERROR) return res; -- GitLab https://gitlab.winehq.org/wine/wine/-/merge_requests/10158
This merge request was approved by Huw Davies. -- https://gitlab.winehq.org/wine/wine/-/merge_requests/10158
participants (3)
-
Andrew Nguyen -
Andrew Nguyen (@arethusa) -
Huw Davies (@huw)