[PATCH v3 1/4] msacm32: Add more invalid parameter checks for acmFormatEnum().
Andrew Eikum
aeikum at codeweavers.com
Thu Jun 8 07:43:01 CDT 2017
Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
On Wed, Jun 07, 2017 at 04:07:50PM -0500, Zebediah Figura wrote:
> v2: restore zero struct, check for error from acmMetrics()
> Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
> ---
> dlls/msacm32/format.c | 21 +++++++++++++++++++++
> dlls/msacm32/tests/msacm.c | 36 ++++++++++++++++++++++++++++++++----
> 2 files changed, 53 insertions(+), 4 deletions(-)
>
> diff --git a/dlls/msacm32/format.c b/dlls/msacm32/format.c
> index 3f3ee5492d..902807cb72 100644
> --- a/dlls/msacm32/format.c
> +++ b/dlls/msacm32/format.c
> @@ -492,6 +492,9 @@ MMRESULT WINAPI acmFormatEnumA(HACMDRIVER had, PACMFORMATDETAILSA pafda,
> if (!pafda)
> return MMSYSERR_INVALPARAM;
>
> + if (!fnCallback)
> + return MMSYSERR_INVALPARAM;
> +
> if (pafda->cbStruct < sizeof(*pafda))
> return MMSYSERR_INVALPARAM;
>
> @@ -499,6 +502,7 @@ MMRESULT WINAPI acmFormatEnumA(HACMDRIVER had, PACMFORMATDETAILSA pafda,
> afdw.cbStruct = sizeof(afdw);
> afdw.dwFormatIndex = pafda->dwFormatIndex;
> afdw.dwFormatTag = pafda->dwFormatTag;
> + afdw.fdwSupport = pafda->fdwSupport;
> afdw.pwfx = pafda->pwfx;
> afdw.cbwfx = pafda->cbwfx;
>
> @@ -613,6 +617,8 @@ MMRESULT WINAPI acmFormatEnumW(HACMDRIVER had, PACMFORMATDETAILSW pafd,
> PWINE_ACMDRIVERID padid;
> WAVEFORMATEX wfxRef;
> BOOL ret;
> + DWORD cbwfxMax;
> + MMRESULT mmr;
>
> TRACE("(%p, %p, %p, %ld, %d)\n",
> had, pafd, fnCallback, dwInstance, fdwEnum);
> @@ -620,9 +626,18 @@ MMRESULT WINAPI acmFormatEnumW(HACMDRIVER had, PACMFORMATDETAILSW pafd,
> if (!pafd)
> return MMSYSERR_INVALPARAM;
>
> + if (!fnCallback)
> + return MMSYSERR_INVALPARAM;
> +
> if (pafd->cbStruct < sizeof(*pafd))
> return MMSYSERR_INVALPARAM;
>
> + if (pafd->fdwSupport)
> + return MMSYSERR_INVALPARAM;
> +
> + if (!pafd->pwfx)
> + return MMSYSERR_INVALPARAM;
> +
> if (fdwEnum & (ACM_FORMATENUMF_WFORMATTAG|ACM_FORMATENUMF_NCHANNELS|
> ACM_FORMATENUMF_NSAMPLESPERSEC|ACM_FORMATENUMF_WBITSPERSAMPLE|
> ACM_FORMATENUMF_CONVERT|ACM_FORMATENUMF_SUGGEST))
> @@ -639,6 +654,12 @@ MMRESULT WINAPI acmFormatEnumW(HACMDRIVER had, PACMFORMATDETAILSW pafd,
> if (fdwEnum & (ACM_FORMATENUMF_CONVERT|ACM_FORMATENUMF_INPUT|ACM_FORMATENUMF_OUTPUT))
> 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) {
> HACMDRIVERID hadid;
>
> diff --git a/dlls/msacm32/tests/msacm.c b/dlls/msacm32/tests/msacm.c
> index 6e79f4677f..f5ab168290 100644
> --- a/dlls/msacm32/tests/msacm.c
> +++ b/dlls/msacm32/tests/msacm.c
> @@ -330,12 +330,10 @@ static BOOL CALLBACK DriverEnumProc(HACMDRIVERID hadid,
> "acmFormatEnumA(): rc = %08x, should be %08x\n",
> rc, MMSYSERR_INVALPARAM);
>
> - if (dwSize < sizeof(WAVEFORMATEX))
> - dwSize = sizeof(WAVEFORMATEX);
> -
> pwfx = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwSize);
>
> - pwfx->cbSize = LOWORD(dwSize) - sizeof(WAVEFORMATEX);
> + if (dwSize >= sizeof(WAVEFORMATEX))
> + pwfx->cbSize = LOWORD(dwSize) - sizeof(WAVEFORMATEX);
> pwfx->wFormatTag = WAVE_FORMAT_UNKNOWN;
>
> fd.cbStruct = sizeof(fd);
> @@ -343,6 +341,36 @@ static BOOL CALLBACK DriverEnumProc(HACMDRIVERID hadid,
> fd.cbwfx = dwSize;
> 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 */
> rc = acmFormatEnumA(had, &fd, FormatEnumProc, 0, 0);
> ok(rc == MMSYSERR_NOERROR,
> --
> 2.13.0
>
>
>
More information about the wine-patches
mailing list