Commit c984aa5f authored by Zebediah Figura's avatar Zebediah Figura Committed by Alexandre Julliard

msacm32: Add more invalid parameter checks for acmFormatEnum().

parent 27f82b46
...@@ -492,6 +492,9 @@ MMRESULT WINAPI acmFormatEnumA(HACMDRIVER had, PACMFORMATDETAILSA pafda, ...@@ -492,6 +492,9 @@ MMRESULT WINAPI acmFormatEnumA(HACMDRIVER had, PACMFORMATDETAILSA pafda,
if (!pafda) if (!pafda)
return MMSYSERR_INVALPARAM; return MMSYSERR_INVALPARAM;
if (!fnCallback)
return MMSYSERR_INVALPARAM;
if (pafda->cbStruct < sizeof(*pafda)) if (pafda->cbStruct < sizeof(*pafda))
return MMSYSERR_INVALPARAM; return MMSYSERR_INVALPARAM;
...@@ -499,6 +502,7 @@ MMRESULT WINAPI acmFormatEnumA(HACMDRIVER had, PACMFORMATDETAILSA pafda, ...@@ -499,6 +502,7 @@ MMRESULT WINAPI acmFormatEnumA(HACMDRIVER had, PACMFORMATDETAILSA pafda,
afdw.cbStruct = sizeof(afdw); afdw.cbStruct = sizeof(afdw);
afdw.dwFormatIndex = pafda->dwFormatIndex; afdw.dwFormatIndex = pafda->dwFormatIndex;
afdw.dwFormatTag = pafda->dwFormatTag; afdw.dwFormatTag = pafda->dwFormatTag;
afdw.fdwSupport = pafda->fdwSupport;
afdw.pwfx = pafda->pwfx; afdw.pwfx = pafda->pwfx;
afdw.cbwfx = pafda->cbwfx; afdw.cbwfx = pafda->cbwfx;
...@@ -613,6 +617,8 @@ MMRESULT WINAPI acmFormatEnumW(HACMDRIVER had, PACMFORMATDETAILSW pafd, ...@@ -613,6 +617,8 @@ MMRESULT WINAPI acmFormatEnumW(HACMDRIVER had, PACMFORMATDETAILSW pafd,
PWINE_ACMDRIVERID padid; PWINE_ACMDRIVERID padid;
WAVEFORMATEX wfxRef; WAVEFORMATEX wfxRef;
BOOL ret; BOOL ret;
DWORD cbwfxMax;
MMRESULT mmr;
TRACE("(%p, %p, %p, %ld, %d)\n", TRACE("(%p, %p, %p, %ld, %d)\n",
had, pafd, fnCallback, dwInstance, fdwEnum); had, pafd, fnCallback, dwInstance, fdwEnum);
...@@ -620,9 +626,18 @@ MMRESULT WINAPI acmFormatEnumW(HACMDRIVER had, PACMFORMATDETAILSW pafd, ...@@ -620,9 +626,18 @@ MMRESULT WINAPI acmFormatEnumW(HACMDRIVER had, PACMFORMATDETAILSW pafd,
if (!pafd) if (!pafd)
return MMSYSERR_INVALPARAM; return MMSYSERR_INVALPARAM;
if (!fnCallback)
return MMSYSERR_INVALPARAM;
if (pafd->cbStruct < sizeof(*pafd)) if (pafd->cbStruct < sizeof(*pafd))
return MMSYSERR_INVALPARAM; return MMSYSERR_INVALPARAM;
if (pafd->fdwSupport)
return MMSYSERR_INVALPARAM;
if (!pafd->pwfx)
return MMSYSERR_INVALPARAM;
if (fdwEnum & (ACM_FORMATENUMF_WFORMATTAG|ACM_FORMATENUMF_NCHANNELS| if (fdwEnum & (ACM_FORMATENUMF_WFORMATTAG|ACM_FORMATENUMF_NCHANNELS|
ACM_FORMATENUMF_NSAMPLESPERSEC|ACM_FORMATENUMF_WBITSPERSAMPLE| ACM_FORMATENUMF_NSAMPLESPERSEC|ACM_FORMATENUMF_WBITSPERSAMPLE|
ACM_FORMATENUMF_CONVERT|ACM_FORMATENUMF_SUGGEST)) ACM_FORMATENUMF_CONVERT|ACM_FORMATENUMF_SUGGEST))
...@@ -639,6 +654,12 @@ MMRESULT WINAPI acmFormatEnumW(HACMDRIVER had, PACMFORMATDETAILSW pafd, ...@@ -639,6 +654,12 @@ MMRESULT WINAPI acmFormatEnumW(HACMDRIVER had, PACMFORMATDETAILSW pafd,
if (fdwEnum & (ACM_FORMATENUMF_CONVERT|ACM_FORMATENUMF_INPUT|ACM_FORMATENUMF_OUTPUT)) if (fdwEnum & (ACM_FORMATENUMF_CONVERT|ACM_FORMATENUMF_INPUT|ACM_FORMATENUMF_OUTPUT))
FIXME("Unsupported fdwEnum values %08x\n", fdwEnum); FIXME("Unsupported fdwEnum values %08x\n", fdwEnum);
mmr = acmMetrics((HACMOBJ)had, ACM_METRIC_MAX_SIZE_FORMAT, &cbwfxMax);
if (mmr != MMSYSERR_NOERROR)
return mmr;
if (pafd->cbwfx < cbwfxMax)
return MMSYSERR_INVALPARAM;
if (had) { if (had) {
HACMDRIVERID hadid; HACMDRIVERID hadid;
......
...@@ -330,11 +330,9 @@ static BOOL CALLBACK DriverEnumProc(HACMDRIVERID hadid, ...@@ -330,11 +330,9 @@ static BOOL CALLBACK DriverEnumProc(HACMDRIVERID hadid,
"acmFormatEnumA(): rc = %08x, should be %08x\n", "acmFormatEnumA(): rc = %08x, should be %08x\n",
rc, MMSYSERR_INVALPARAM); rc, MMSYSERR_INVALPARAM);
if (dwSize < sizeof(WAVEFORMATEX))
dwSize = sizeof(WAVEFORMATEX);
pwfx = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwSize); pwfx = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwSize);
if (dwSize >= sizeof(WAVEFORMATEX))
pwfx->cbSize = LOWORD(dwSize) - sizeof(WAVEFORMATEX); pwfx->cbSize = LOWORD(dwSize) - sizeof(WAVEFORMATEX);
pwfx->wFormatTag = WAVE_FORMAT_UNKNOWN; pwfx->wFormatTag = WAVE_FORMAT_UNKNOWN;
...@@ -343,6 +341,36 @@ static BOOL CALLBACK DriverEnumProc(HACMDRIVERID hadid, ...@@ -343,6 +341,36 @@ static BOOL CALLBACK DriverEnumProc(HACMDRIVERID hadid,
fd.cbwfx = dwSize; fd.cbwfx = dwSize;
fd.dwFormatTag = WAVE_FORMAT_UNKNOWN; fd.dwFormatTag = WAVE_FORMAT_UNKNOWN;
/* try bad callback */
rc = acmFormatEnumA(had, &fd, NULL, 0, 0);
ok(rc == MMSYSERR_INVALPARAM,
"acmFormatEnumA(): rc = %08x, should be %08x\n",
rc, MMSYSERR_INVALPARAM);
/* try bad pwfx */
fd.pwfx = NULL;
rc = acmFormatEnumA(had, &fd, FormatEnumProc, 0, 0);
ok(rc == MMSYSERR_INVALPARAM,
"acmFormatEnumA(): rc = %08x, should be %08x\n",
rc, MMSYSERR_INVALPARAM);
fd.pwfx = pwfx;
/* fdwSupport must be zero */
fd.fdwSupport = 0xdeadbeef;
rc = acmFormatEnumA(had, &fd, FormatEnumProc, 0, 0);
ok(rc == MMSYSERR_INVALPARAM,
"acmFormatEnumA(): rc = %08x, should be %08x\n",
rc, MMSYSERR_INVALPARAM);
fd.fdwSupport = 0;
/* try bad pwfx structure size */
fd.cbwfx = dwSize-1;
rc = acmFormatEnumA(had, &fd, FormatEnumProc, 0, 0);
ok(rc == MMSYSERR_INVALPARAM,
"acmFormatEnumA(): rc = %08x, should be %08x\n",
rc, MMSYSERR_INVALPARAM);
fd.cbwfx = dwSize;
/* try valid parameters */ /* try valid parameters */
rc = acmFormatEnumA(had, &fd, FormatEnumProc, 0, 0); rc = acmFormatEnumA(had, &fd, FormatEnumProc, 0, 0);
ok(rc == MMSYSERR_NOERROR, ok(rc == MMSYSERR_NOERROR,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment