wine-staging/patches/ml-patches/0015-winmm-Don-t-crash-in-waveOutOpen-when-nSamplesPerSec.patch
2018-08-04 15:22:30 +10:00

69 lines
2.4 KiB
Diff

From 65af7470de21a5d3b99ed8bc96f57d3f93012b56 Mon Sep 17 00:00:00 2001
From: Fabian Maurer <dark.shadow4@web.de>
Date: Fri, 3 Aug 2018 07:55:03 -0500
Subject: [PATCH] winmm: Don't crash in waveOutOpen when nSamplesPerSec is 0
and add tests
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=45530
Signed-off-by: Fabian Maurer <dark.shadow4@web.de>
Signed-off-by: Andrew Eikum <aeikum@codeweavers.com>
---
dlls/winmm/tests/wave.c | 22 ++++++++++++++++++++++
dlls/winmm/waveform.c | 7 +++++++
2 files changed, 29 insertions(+)
diff --git a/dlls/winmm/tests/wave.c b/dlls/winmm/tests/wave.c
index b402e21917..c106594b3f 100644
--- a/dlls/winmm/tests/wave.c
+++ b/dlls/winmm/tests/wave.c
@@ -1415,6 +1415,28 @@ static void wave_out_test_device(UINT_PTR device)
} else
trace("waveOutOpen(%s): 32 bit float samples not supported\n",
dev_name(device));
+
+ /* Test invalid parameters */
+
+ format.wFormatTag = WAVE_FORMAT_PCM;
+ format.nChannels = 1;
+ format.nSamplesPerSec = 11025;
+ format.nBlockAlign = 1;
+ format.nAvgBytesPerSec = 11025 * 1;
+ format.wBitsPerSample = 8;
+ format.cbSize = 0;
+
+ format.nAvgBytesPerSec = 0;
+ rc = waveOutOpen(&wout, device, &format, 0, 0, 0);
+ ok(rc == MMSYSERR_NOERROR,
+ "waveOutOpen(%s): returned %s\n",dev_name(device),wave_out_error(rc));
+ waveOutClose(wout);
+ format.nAvgBytesPerSec = 11025 * 1;
+
+ format.nSamplesPerSec = 0;
+ rc = waveOutOpen(&wout, device, &format, 0, 0, 0);
+ ok(rc == MMSYSERR_INVALPARAM || rc == WAVERR_BADFORMAT, /* XP and lower return WAVERR_BADFORMAT */
+ "waveOutOpen(%s): returned %s\n",dev_name(device),wave_out_error(rc));
}
static void wave_out_tests(void)
diff --git a/dlls/winmm/waveform.c b/dlls/winmm/waveform.c
index 045bf4ac20..0a259c0f74 100644
--- a/dlls/winmm/waveform.c
+++ b/dlls/winmm/waveform.c
@@ -1088,6 +1088,13 @@ static LRESULT WINMM_OpenDevice(WINMM_Device *device, WINMM_OpenInfo *info,
}
if(info->format->wFormatTag == WAVE_FORMAT_PCM){
+
+ if (info->format->nSamplesPerSec == 0)
+ {
+ ret = MMSYSERR_INVALPARAM;
+ goto error;
+ }
+
/* we aren't guaranteed that the struct in lpFormat is a full
* WAVEFORMATEX struct, which IAC::IsFormatSupported requires */
device->orig_fmt = HeapAlloc(GetProcessHeap(), 0, sizeof(WAVEFORMATEX));
--
2.18.0