This one adds test failures on my machine:
msacm.c:542: Test failed: acmFormatDetailsA(): rc = 00000200, should be 0000000b msacm.c:542: Test failed: acmFormatDetailsA(): rc = 00000200, should be 0000000b msacm.c:542: Test failed: acmFormatDetailsA(): rc = 00000200, should be 0000000b msacm.c:542: Test failed: acmFormatDetailsA(): rc = 00000200, should be 0000000b msacm.c:542: Test failed: acmFormatDetailsA(): rc = 00000200, should be 0000000b msacm.c:542: Test failed: acmFormatDetailsA(): rc = 00000200, should be 0000000b
Andrew
On Wed, Jun 07, 2017 at 10:28:40AM -0500, Zebediah Figura wrote:
v2: restore zero struct, check for error from acmFormatTagDetailsW() Signed-off-by: Zebediah Figura z.figura12@gmail.com
dlls/msacm32/format.c | 34 ++++++++++-- dlls/msacm32/tests/msacm.c | 132 +++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 163 insertions(+), 3 deletions(-)
diff --git a/dlls/msacm32/format.c b/dlls/msacm32/format.c index 902807cb72..359fbe8366 100644 --- a/dlls/msacm32/format.c +++ b/dlls/msacm32/format.c @@ -68,7 +68,7 @@ static BOOL CALLBACK MSACM_FillFormatTagsCB(HACMDRIVERID hadid, HACMDRIVER had;
if (acmDriverOpen(&had, hadid, 0) == MMSYSERR_NOERROR) {
ACMFORMATDETAILSW afd;
MMRESULT mmr; WCHAR buffer[ACMFORMATDETAILS_FORMAT_CHARS+16];ACMFORMATDETAILSW afd = {0}; unsigned int i, len;@@ -87,6 +87,7 @@ static BOOL CALLBACK MSACM_FillFormatTagsCB(HACMDRIVERID hadid, int j;
afd.dwFormatIndex = i;
mmr = acmFormatDetailsW(had, &afd, ACM_FORMATDETAILSF_INDEX); if (mmr == MMSYSERR_NOERROR) { lstrcpynW(buffer, afd.szFormat, ACMFORMATTAGDETAILS_FORMATTAG_CHARS + 1);afd.fdwSupport = 0;@@ -112,7 +113,7 @@ static BOOL CALLBACK MSACM_FillFormatTagsCB(HACMDRIVERID hadid, HACMDRIVER had;
if (acmDriverOpen(&had, hadid, 0) == MMSYSERR_NOERROR) {
ACMFORMATDETAILSW afd;
ACMFORMATDETAILSW afd = {0};afd.cbStruct = sizeof(afd); afd.dwFormatTag = paftd->dwFormatTag;
@@ -376,10 +377,14 @@ MMRESULT WINAPI acmFormatDetailsA(HACMDRIVER had, PACMFORMATDETAILSA pafd, ACMFORMATDETAILSW afdw; MMRESULT mmr;
- if (!pafd)
return MMSYSERR_INVALPARAM;- memset(&afdw, 0, sizeof(afdw)); afdw.cbStruct = sizeof(afdw); afdw.dwFormatIndex = pafd->dwFormatIndex; afdw.dwFormatTag = pafd->dwFormatTag;
- afdw.fdwSupport = pafd->fdwSupport; afdw.pwfx = pafd->pwfx; afdw.cbwfx = pafd->cbwfx;
@@ -401,11 +406,24 @@ MMRESULT WINAPI acmFormatDetailsW(HACMDRIVER had, PACMFORMATDETAILSW pafd, DWORD MMRESULT mmr; static const WCHAR fmt1[] = {'%','d',' ','H','z',0}; static const WCHAR fmt2[] = {';',' ','%','d',' ','b','i','t','s',0};
ACMFORMATTAGDETAILSW aftd = {0};
TRACE("(%p, %p, %d)\n", had, pafd, fdwDetails);
if (!pafd)
return MMSYSERR_INVALPARAM;if (pafd->cbStruct < sizeof(*pafd)) return MMSYSERR_INVALPARAM;
if (!pafd->pwfx)
return MMSYSERR_INVALPARAM;if (pafd->cbwfx < sizeof(PCMWAVEFORMAT))
return MMSYSERR_INVALPARAM;if (pafd->fdwSupport)
return MMSYSERR_INVALPARAM;switch (fdwDetails) { case ACM_FORMATDETAILSF_FORMAT: if (pafd->dwFormatTag != pafd->pwfx->wFormatTag) {
@@ -430,7 +448,16 @@ MMRESULT WINAPI acmFormatDetailsW(HACMDRIVER had, PACMFORMATDETAILSW pafd, DWORD } break; case ACM_FORMATDETAILSF_INDEX:
- /* should check pafd->dwFormatIndex < aftd->cStandardFormats */
aftd.cbStruct = sizeof(aftd);aftd.dwFormatTag = pafd->dwFormatTag;mmr = acmFormatTagDetailsW(had, &aftd, ACM_FORMATTAGDETAILSF_FORMATTAG);if (mmr != MMSYSERR_NOERROR)break;if (pafd->dwFormatIndex >= aftd.cStandardFormats){mmr = MMSYSERR_INVALPARAM;break; mmr = MSACM_Message(had, ACMDM_FORMAT_DETAILS, (LPARAM)pafd, fdwDetails); break; default:}@@ -581,6 +608,7 @@ static BOOL MSACM_FormatEnumHelper(PWINE_ACMDRIVERID padid, HACMDRIVER had, for (j = 0; j < aftd.cStandardFormats; j++) { pafd->dwFormatIndex = j; pafd->dwFormatTag = aftd.dwFormatTag;
pafd->fdwSupport = 0; if (acmFormatDetailsW(had, pafd, ACM_FORMATDETAILSF_INDEX) != MMSYSERR_NOERROR) continue;diff --git a/dlls/msacm32/tests/msacm.c b/dlls/msacm32/tests/msacm.c index f5ab168290..1b47fe2087 100644 --- a/dlls/msacm32/tests/msacm.c +++ b/dlls/msacm32/tests/msacm.c @@ -38,9 +38,110 @@ static BOOL CALLBACK FormatTagEnumProc(HACMDRIVERID hadid, DWORD_PTR dwInstance, DWORD fdwSupport) {
MMRESULT rc;
HACMDRIVER had;
if (winetest_interactive) trace(" Format 0x%04x: %s\n", paftd->dwFormatTag, paftd->szFormatTag);
rc = acmDriverOpen(&had, hadid, 0);
ok(rc == MMSYSERR_NOERROR || rc == MMSYSERR_NODRIVER,
"acmDriverOpen(): rc = %08x, should be %08x\n",rc, MMSYSERR_NOERROR);if (rc == MMSYSERR_NOERROR)
{
ACMFORMATDETAILSA fd = {0};WAVEFORMATEX *pwfx;DWORD i;fd.cbStruct = sizeof(fd);if (paftd->cbFormatSize < sizeof(WAVEFORMATEX))pwfx = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(WAVEFORMATEX));elsepwfx = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, paftd->cbFormatSize);fd.pwfx = pwfx;fd.cbwfx = paftd->cbFormatSize;fd.dwFormatTag = paftd->dwFormatTag;/* try bad pwfx */fd.pwfx = NULL;rc = acmFormatDetailsA(had, &fd, ACM_FORMATDETAILSF_FORMAT);ok(rc == MMSYSERR_INVALPARAM,"acmFormatDetailsA(): rc = %08x, should be %08x\n",rc, MMSYSERR_INVALPARAM);fd.pwfx = pwfx;/* try bad wFormatTag */fd.pwfx->wFormatTag = WAVE_FORMAT_UNKNOWN;rc = acmFormatDetailsA(had, &fd, ACM_FORMATDETAILSF_FORMAT);ok(rc == MMSYSERR_INVALPARAM,"acmFormatDetailsA(): rc = %08x, should be %08x\n",rc, MMSYSERR_INVALPARAM);fd.pwfx->wFormatTag = paftd->dwFormatTag;/* try bad fdwSupport */fd.fdwSupport = 0xdeadbeef;rc = acmFormatDetailsA(had, &fd, ACM_FORMATDETAILSF_FORMAT);ok(rc == MMSYSERR_INVALPARAM,"acmFormatDetailsA(): rc = %08x, should be %08x\n",rc, MMSYSERR_INVALPARAM);fd.fdwSupport = 0;/* try bad pwfx structure size */fd.cbwfx = sizeof(PCMWAVEFORMAT)-1;rc = acmFormatDetailsA(had, &fd, ACM_FORMATDETAILSF_FORMAT);ok(rc == MMSYSERR_INVALPARAM,"acmFormatDetailsA(): rc = %08x, should be %08x\n",rc, MMSYSERR_INVALPARAM);fd.cbwfx = paftd->cbFormatSize;/* test bad parameters (all zero) */rc = acmFormatDetailsA(had, &fd, ACM_FORMATDETAILSF_FORMAT);ok(rc == ACMERR_NOTPOSSIBLE,"acmFormatDetailsA(): rc = %08x, should be %08x\n",rc, ACMERR_NOTPOSSIBLE);/* test index */for (i = 0; i < paftd->cStandardFormats; i++){fd.dwFormatIndex = i;fd.fdwSupport = 0;fd.cbwfx = paftd->cbFormatSize;fd.pwfx->cbSize = 0xbeef;rc = acmFormatDetailsA(had, &fd, ACM_FORMATDETAILSF_INDEX);ok(rc == MMSYSERR_NOERROR,"acmFormatDetailsA(): rc = %08x, should be %08x\n",rc, MMSYSERR_NOERROR);/* Windows will write cbSize (and other data) even if the* given cbwfx is not large enough */fd.fdwSupport = 0;fd.cbwfx = sizeof(PCMWAVEFORMAT);fd.pwfx->cbSize = 0xbeef;rc = acmFormatDetailsA(had, &fd, ACM_FORMATDETAILSF_INDEX);todo_wine_if(rc != MMSYSERR_NOERROR) /* remove when fixed */ok(rc == MMSYSERR_NOERROR,"acmFormatDetailsA(): rc = %08x, should be %08x\n",rc, MMSYSERR_NOERROR);if (paftd->dwFormatTag != WAVE_FORMAT_PCM)todo_wine_if(fd.pwfx->cbSize != paftd->cbFormatSize - sizeof(WAVEFORMATEX)) /* remove when fixed */ok(fd.pwfx->cbSize == paftd->cbFormatSize - sizeof(WAVEFORMATEX),"expected cbSize %d, got %d\n",paftd->cbFormatSize - sizeof(WAVEFORMATEX), fd.pwfx->cbSize);}/* one more */fd.dwFormatIndex = paftd->cStandardFormats;fd.fdwSupport = 0;rc = acmFormatDetailsA(had, &fd, ACM_FORMATDETAILSF_INDEX);ok(rc == MMSYSERR_INVALPARAM,"acmFormatDetailsA(): rc = %08x, should be %08x\n",rc, MMSYSERR_INVALPARAM);HeapFree(GetProcessHeap(), 0, pwfx);} return TRUE;
}
@@ -411,6 +512,37 @@ static BOOL CALLBACK DriverEnumProc(HACMDRIVERID hadid, "acmFormatTagEnumA(): rc = %08x, should be %08x\n", rc, MMSYSERR_NOERROR);
/* try bad pointer */rc = acmFormatDetailsA(had, NULL, ACM_FORMATDETAILSF_INDEX);ok(rc == MMSYSERR_INVALPARAM,"acmFormatDetailsA(): rc = %08x, should be %08x\n",rc, MMSYSERR_INVALPARAM);/* try bad structure size */ZeroMemory(&fd, sizeof(fd));rc = acmFormatDetailsA(had, &fd, ACM_FORMATDETAILSF_INDEX);ok(rc == MMSYSERR_INVALPARAM,"acmFormatDetailsA(): rc = %08x, should be %08x\n",rc, MMSYSERR_INVALPARAM);fd.cbStruct = sizeof(fd) - 1;rc = acmFormatDetailsA(had, &fd, ACM_FORMATDETAILSF_INDEX);ok(rc == MMSYSERR_INVALPARAM,"acmFormatDetailsA(): rc = %08x, should be %08x\n",rc, MMSYSERR_INVALPARAM);fd.cbStruct = sizeof(fd);fd.pwfx = pwfx;ZeroMemory(fd.pwfx, dwSize);fd.cbwfx = dwSize;fd.dwFormatTag = WAVE_FORMAT_UNKNOWN;/* try WAVE_FORMAT_UNKNOWN */rc = acmFormatDetailsA(had, &fd, ACM_FORMATDETAILSF_INDEX);ok(rc == MMSYSERR_INVALPARAM,"acmFormatDetailsA(): rc = %08x, should be %08x\n",rc, MMSYSERR_INVALPARAM);HeapFree(GetProcessHeap(), 0, pwfx); /* try invalid handle */-- 2.13.0