Commit 321189aa authored by Robert Reif's avatar Robert Reif Committed by Alexandre Julliard

More parameter checking fixes with tests.

parent 426b0236
...@@ -741,6 +741,15 @@ MMRESULT WINAPI acmFormatTagEnumA(HACMDRIVER had, PACMFORMATTAGDETAILSA paftda, ...@@ -741,6 +741,15 @@ MMRESULT WINAPI acmFormatTagEnumA(HACMDRIVER had, PACMFORMATTAGDETAILSA paftda,
ACMFORMATTAGDETAILSW aftdw; ACMFORMATTAGDETAILSW aftdw;
struct MSACM_FormatTagEnumWtoA_Instance aftei; struct MSACM_FormatTagEnumWtoA_Instance aftei;
if (!paftda)
return MMSYSERR_INVALPARAM;
if (paftda->cbStruct < sizeof(*paftda))
return MMSYSERR_INVALPARAM;
if (fdwEnum != 0)
return MMSYSERR_INVALFLAG;
memset(&aftdw, 0, sizeof(aftdw)); memset(&aftdw, 0, sizeof(aftdw));
aftdw.cbStruct = sizeof(aftdw); aftdw.cbStruct = sizeof(aftdw);
aftdw.dwFormatTagIndex = paftda->dwFormatTagIndex; aftdw.dwFormatTagIndex = paftda->dwFormatTagIndex;
...@@ -768,7 +777,14 @@ MMRESULT WINAPI acmFormatTagEnumW(HACMDRIVER had, PACMFORMATTAGDETAILSW paftd, ...@@ -768,7 +777,14 @@ MMRESULT WINAPI acmFormatTagEnumW(HACMDRIVER had, PACMFORMATTAGDETAILSW paftd,
TRACE("(%p, %p, %p, %ld, %ld)\n", TRACE("(%p, %p, %p, %ld, %ld)\n",
had, paftd, fnCallback, dwInstance, fdwEnum); had, paftd, fnCallback, dwInstance, fdwEnum);
if (paftd->cbStruct < sizeof(*paftd)) return MMSYSERR_INVALPARAM; if (!paftd)
return MMSYSERR_INVALPARAM;
if (paftd->cbStruct < sizeof(*paftd))
return MMSYSERR_INVALPARAM;
if (fdwEnum != 0)
return MMSYSERR_INVALFLAG;
/* (WS) MSDN info page says that if had != 0, then we should find /* (WS) MSDN info page says that if had != 0, then we should find
* the specific driver to get its tags from. Therefore I'm removing * the specific driver to get its tags from. Therefore I'm removing
......
...@@ -960,7 +960,7 @@ static LRESULT PCM_FormatSuggest(PACMDRVFORMATSUGGEST adfs) ...@@ -960,7 +960,7 @@ static LRESULT PCM_FormatSuggest(PACMDRVFORMATSUGGEST adfs)
if (adfs->pwfxSrc->wFormatTag != WAVE_FORMAT_PCM) { if (adfs->pwfxSrc->wFormatTag != WAVE_FORMAT_PCM) {
WARN("not possible\n"); WARN("not possible\n");
return ACMERR_NOTPOSSIBLE; return ACMERR_NOTPOSSIBLE;
} }
adfs->pwfxDst->wFormatTag = adfs->pwfxSrc->wFormatTag; adfs->pwfxDst->wFormatTag = adfs->pwfxSrc->wFormatTag;
} }
/* check if result is ok */ /* check if result is ok */
......
...@@ -31,6 +31,16 @@ ...@@ -31,6 +31,16 @@
#include "mmreg.h" #include "mmreg.h"
#include "msacm.h" #include "msacm.h"
static BOOL CALLBACK FormatTagEnumProc(HACMDRIVERID hadid,
PACMFORMATTAGDETAILS paftd,
DWORD dwInstance,
DWORD fdwSupport)
{
trace(" Format 0x%04lx: %s\n", paftd->dwFormatTag, paftd->szFormatTag);
return TRUE;
}
static BOOL CALLBACK FormatEnumProc(HACMDRIVERID hadid, static BOOL CALLBACK FormatEnumProc(HACMDRIVERID hadid,
LPACMFORMATDETAILS pafd, LPACMFORMATDETAILS pafd,
DWORD dwInstance, DWORD dwInstance,
...@@ -141,8 +151,6 @@ static BOOL CALLBACK DriverEnumProc(HACMDRIVERID hadid, ...@@ -141,8 +151,6 @@ static BOOL CALLBACK DriverEnumProc(HACMDRIVERID hadid,
if (rc == MMSYSERR_NOERROR) { if (rc == MMSYSERR_NOERROR) {
DWORD dwSize; DWORD dwSize;
WAVEFORMATEX * pwfx;
ACMFORMATDETAILS fd;
HACMDRIVERID hid; HACMDRIVERID hid;
/* try bad pointer */ /* try bad pointer */
...@@ -202,6 +210,10 @@ static BOOL CALLBACK DriverEnumProc(HACMDRIVERID hadid, ...@@ -202,6 +210,10 @@ static BOOL CALLBACK DriverEnumProc(HACMDRIVERID hadid,
"acmMetrics(): rc = %08x, should be %08x\n", "acmMetrics(): rc = %08x, should be %08x\n",
rc, MMSYSERR_NOERROR); rc, MMSYSERR_NOERROR);
if (rc == MMSYSERR_NOERROR) { if (rc == MMSYSERR_NOERROR) {
ACMFORMATDETAILS fd;
WAVEFORMATEX * pwfx;
ACMFORMATTAGDETAILS aftd;
/* try bad pointer */ /* try bad pointer */
rc = acmFormatEnum(had, 0, FormatEnumProc, 0, 0); rc = acmFormatEnum(had, 0, FormatEnumProc, 0, 0);
ok(rc == MMSYSERR_INVALPARAM, ok(rc == MMSYSERR_INVALPARAM,
...@@ -241,6 +253,40 @@ static BOOL CALLBACK DriverEnumProc(HACMDRIVERID hadid, ...@@ -241,6 +253,40 @@ static BOOL CALLBACK DriverEnumProc(HACMDRIVERID hadid,
"acmFormatEnum(): rc = %08x, should be %08x\n", "acmFormatEnum(): rc = %08x, should be %08x\n",
rc, MMSYSERR_NOERROR); rc, MMSYSERR_NOERROR);
/* try bad pointer */
rc = acmFormatTagEnum(had, 0, FormatTagEnumProc, 0, 0);
ok(rc == MMSYSERR_INVALPARAM,
"acmFormatTagEnum(): rc = %08x, should be %08x\n",
rc, MMSYSERR_INVALPARAM);
/* try bad structure size */
ZeroMemory(&aftd, sizeof(fd));
rc = acmFormatTagEnum(had, &aftd, FormatTagEnumProc, 0, 0);
ok(rc == MMSYSERR_INVALPARAM,
"acmFormatTagEnum(): rc = %08x, should be %08x\n",
rc, MMSYSERR_INVALPARAM);
aftd.cbStruct = sizeof(aftd) - 1;
rc = acmFormatTagEnum(had, &aftd, FormatTagEnumProc, 0, 0);
ok(rc == MMSYSERR_INVALPARAM,
"acmFormatTagEnum(): rc = %08x, should be %08x\n",
rc, MMSYSERR_INVALPARAM);
aftd.cbStruct = sizeof(aftd);
aftd.dwFormatTag = WAVE_FORMAT_UNKNOWN;
/* try bad flag */
rc = acmFormatTagEnum(had, &aftd, FormatTagEnumProc, 0, 1);
ok(rc == MMSYSERR_INVALFLAG,
"acmFormatTagEnum(): rc = %08x, should be %08x\n",
rc, MMSYSERR_INVALFLAG);
/* try valid parameters */
rc = acmFormatTagEnum(had, &aftd, FormatTagEnumProc, 0, 0);
ok(rc == MMSYSERR_NOERROR,
"acmFormatTagEnum(): rc = %08x, should be %08x\n",
rc, MMSYSERR_NOERROR);
free(pwfx); free(pwfx);
/* try invalid handle */ /* try invalid handle */
......
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