Module: wine Branch: master Commit: d4fd43c97117c9135f5b032e2cc8c899b4b91de5 URL: http://source.winehq.org/git/wine.git/?a=commit;h=d4fd43c97117c9135f5b032e2c...
Author: Bruno Jesus 00cpxxx@gmail.com Date: Sun Aug 28 04:07:29 2016 -0300
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
---
dlls/msacm32/stream.c | 5 +++++ dlls/msacm32/tests/msacm.c | 12 ++++++++---- 2 files changed, 13 insertions(+), 4 deletions(-)
diff --git a/dlls/msacm32/stream.c b/dlls/msacm32/stream.c index b380b46..4b4976f 100644 --- a/dlls/msacm32/stream.c +++ b/dlls/msacm32/stream.c @@ -312,6 +312,11 @@ MMRESULT WINAPI acmStreamPrepareHeader(HACMSTREAM has, PACMSTREAMHEADER pash, WARN("invalid use of reserved parameter\n"); 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 * size. some fields are private to msacm internals, and are exposed diff --git a/dlls/msacm32/tests/msacm.c b/dlls/msacm32/tests/msacm.c index 06e530b..5ec4717 100644 --- a/dlls/msacm32/tests/msacm.c +++ b/dlls/msacm32/tests/msacm.c @@ -591,14 +591,19 @@ static void test_prepareheader(void) hdr.cbDstLength = sizeof(pcm);
mr = acmStreamPrepareHeader(has, &hdr, 0); -todo_wine ok(mr == MMSYSERR_INVALPARAM, "expected 0x0b, got 0x%x\n", mr);
hdr.cbSrcLength = src->wfx.nBlockAlign - 1; /* less than block align */ mr = acmStreamPrepareHeader(has, &hdr, 0); -todo_wine 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; mr = acmStreamPrepareHeader(has, &hdr, 1); /* invalid use of reserved parameter */ ok(mr == MMSYSERR_INVALFLAG, "expected 0x0a, got 0x%x\n", mr); @@ -674,7 +679,6 @@ todo_wine hdr.pbDst = pcm; hdr.cbDstLength = -4; mr = acmStreamPrepareHeader(has, &hdr, 0); -todo_wine { ok(mr == ACMERR_NOTPOSSIBLE, "expected 0x200, got 0x%x\n", mr); ok(hdr.fdwStatus == 0, "expected 0, got 0x%x\n", hdr.fdwStatus);
@@ -687,7 +691,7 @@ todo_wine {
mr = acmStreamUnprepareHeader(has, &hdr, 0); ok(mr == ACMERR_UNPREPARED, "expected 0x202, got 0x%x\n", mr); -} + /* Less output space than required */ memset(&hdr, 0, sizeof(hdr)); hdr.cbStruct = sizeof(hdr);