From: Andrew Eikum Subject: Re: [PATCH 2/3] msacm32: Handle invalid source length in acmStreamPrepareHeader Message-Id: <20160829133856.GL5058@foghorn.codeweavers.com> Date: Mon, 29 Aug 2016 08:38:56 -0500 In-Reply-To: <20160828070730.14846-2-00cpxxx@gmail.com> References: <20160828070730.14846-1-00cpxxx@gmail.com> <20160828070730.14846-2-00cpxxx@gmail.com> Signed-off-by: Andrew Eikum On Sun, Aug 28, 2016 at 04:07:29AM -0300, Bruno Jesus wrote: > Signed-off-by: Bruno Jesus <00cpxxx@gmail.com> > --- > 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); > -- > 2.9.3 > > >