Bruno Jesus : msacm32: Handle invalid source length in acmStreamPrepareHeader.

Alexandre Julliard julliard at winehq.org
Mon Aug 29 11:07:23 CDT 2016


Module: wine
Branch: master
Commit: d4fd43c97117c9135f5b032e2cc8c899b4b91de5
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=d4fd43c97117c9135f5b032e2cc8c899b4b91de5

Author: Bruno Jesus <00cpxxx at gmail.com>
Date:   Sun Aug 28 04:07:29 2016 -0300

msacm32: Handle invalid source length in acmStreamPrepareHeader.

Signed-off-by: Bruno Jesus <00cpxxx at gmail.com>
Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at 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);




More information about the wine-cvs mailing list