msacm32: Handle invalid source length in acmStreamPrepareHeader.
Signed-off-by: Bruno Jesus <00cpxxx@gmail.com> Signed-off-by: Andrew Eikum <aeikum@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
61eda97fd5
commit
d4fd43c971
|
@ -312,6 +312,11 @@ MMRESULT WINAPI acmStreamPrepareHeader(HACMSTREAM has, PACMSTREAMHEADER pash,
|
||||||
WARN("invalid use of reserved parameter\n");
|
WARN("invalid use of reserved parameter\n");
|
||||||
return MMSYSERR_INVALFLAG;
|
return MMSYSERR_INVALFLAG;
|
||||||
}
|
}
|
||||||
|
if (pash->cbSrcLength < was->drvInst.pwfxSrc->nBlockAlign) {
|
||||||
|
WARN("source smaller than block align (%d < %d)\n",
|
||||||
|
pash->cbSrcLength, was->drvInst.pwfxSrc->nBlockAlign);
|
||||||
|
return pash->cbSrcLength ? ACMERR_NOTPOSSIBLE : MMSYSERR_INVALPARAM;
|
||||||
|
}
|
||||||
|
|
||||||
/* Note: the ACMSTREAMHEADER and ACMDRVSTREAMHEADER structs are of same
|
/* Note: the ACMSTREAMHEADER and ACMDRVSTREAMHEADER structs are of same
|
||||||
* size. some fields are private to msacm internals, and are exposed
|
* size. some fields are private to msacm internals, and are exposed
|
||||||
|
|
|
@ -591,14 +591,19 @@ static void test_prepareheader(void)
|
||||||
hdr.cbDstLength = sizeof(pcm);
|
hdr.cbDstLength = sizeof(pcm);
|
||||||
|
|
||||||
mr = acmStreamPrepareHeader(has, &hdr, 0);
|
mr = acmStreamPrepareHeader(has, &hdr, 0);
|
||||||
todo_wine
|
|
||||||
ok(mr == MMSYSERR_INVALPARAM, "expected 0x0b, got 0x%x\n", mr);
|
ok(mr == MMSYSERR_INVALPARAM, "expected 0x0b, got 0x%x\n", mr);
|
||||||
|
|
||||||
hdr.cbSrcLength = src->wfx.nBlockAlign - 1; /* less than block align */
|
hdr.cbSrcLength = src->wfx.nBlockAlign - 1; /* less than block align */
|
||||||
mr = acmStreamPrepareHeader(has, &hdr, 0);
|
mr = acmStreamPrepareHeader(has, &hdr, 0);
|
||||||
todo_wine
|
|
||||||
ok(mr == ACMERR_NOTPOSSIBLE, "expected 0x200, got 0x%x\n", mr);
|
ok(mr == ACMERR_NOTPOSSIBLE, "expected 0x200, got 0x%x\n", mr);
|
||||||
|
|
||||||
|
hdr.cbSrcLength = src->wfx.nBlockAlign + 1; /* more than block align */
|
||||||
|
mr = acmStreamPrepareHeader(has, &hdr, 0);
|
||||||
|
ok(mr == MMSYSERR_NOERROR, "prepare failed: 0x%x\n", mr);
|
||||||
|
|
||||||
|
mr = acmStreamUnprepareHeader(has, &hdr, 0);
|
||||||
|
ok(mr == MMSYSERR_NOERROR, "unprepare failed: 0x%x\n", mr);
|
||||||
|
|
||||||
hdr.cbSrcLength = src->wfx.nBlockAlign;
|
hdr.cbSrcLength = src->wfx.nBlockAlign;
|
||||||
mr = acmStreamPrepareHeader(has, &hdr, 1); /* invalid use of reserved parameter */
|
mr = acmStreamPrepareHeader(has, &hdr, 1); /* invalid use of reserved parameter */
|
||||||
ok(mr == MMSYSERR_INVALFLAG, "expected 0x0a, got 0x%x\n", mr);
|
ok(mr == MMSYSERR_INVALFLAG, "expected 0x0a, got 0x%x\n", mr);
|
||||||
|
@ -674,7 +679,6 @@ todo_wine
|
||||||
hdr.pbDst = pcm;
|
hdr.pbDst = pcm;
|
||||||
hdr.cbDstLength = -4;
|
hdr.cbDstLength = -4;
|
||||||
mr = acmStreamPrepareHeader(has, &hdr, 0);
|
mr = acmStreamPrepareHeader(has, &hdr, 0);
|
||||||
todo_wine {
|
|
||||||
ok(mr == ACMERR_NOTPOSSIBLE, "expected 0x200, got 0x%x\n", mr);
|
ok(mr == ACMERR_NOTPOSSIBLE, "expected 0x200, got 0x%x\n", mr);
|
||||||
ok(hdr.fdwStatus == 0, "expected 0, got 0x%x\n", hdr.fdwStatus);
|
ok(hdr.fdwStatus == 0, "expected 0, got 0x%x\n", hdr.fdwStatus);
|
||||||
|
|
||||||
|
@ -687,7 +691,7 @@ todo_wine {
|
||||||
|
|
||||||
mr = acmStreamUnprepareHeader(has, &hdr, 0);
|
mr = acmStreamUnprepareHeader(has, &hdr, 0);
|
||||||
ok(mr == ACMERR_UNPREPARED, "expected 0x202, got 0x%x\n", mr);
|
ok(mr == ACMERR_UNPREPARED, "expected 0x202, got 0x%x\n", mr);
|
||||||
}
|
|
||||||
/* Less output space than required */
|
/* Less output space than required */
|
||||||
memset(&hdr, 0, sizeof(hdr));
|
memset(&hdr, 0, sizeof(hdr));
|
||||||
hdr.cbStruct = sizeof(hdr);
|
hdr.cbStruct = sizeof(hdr);
|
||||||
|
|
Loading…
Reference in New Issue