msadpcm32.acm: Stop converting data instead of crashing.

Signed-off-by: Bruno Jesus <00cpxxx@gmail.com>
Signed-off-by: Andrew Eikum <aeikum@codeweavers.com>
This commit is contained in:
Bruno Jesus 2015-09-29 22:06:21 +08:00 committed by Alexandre Julliard
parent 972a74ddfe
commit 72528be84f
1 changed files with 10 additions and 2 deletions

View File

@ -249,9 +249,17 @@ static void cvtSSms16K(const ACMDRVSTREAMINSTANCE *adsi,
{ {
const unsigned char* in_src = src; const unsigned char* in_src = src;
assert(*src <= 6); /* Catch a problem from Tomb Raider III (bug 21000) where it passes
* invalid data after a valid sequence of blocks */
if (*src > 6 || *(src + 1) > 6)
{
/* Recalculate the amount of used output buffer. We are not changing
* nsrc, let's assume the bad data was parsed */
*ndst -= nblock * nsamp_blk * adsi->pwfxDst->nBlockAlign;
WARN("Invalid ADPCM data, stopping conversion\n");
break;
}
coeffL = MSADPCM_CoeffSet[*src++]; coeffL = MSADPCM_CoeffSet[*src++];
assert(*src <= 6);
coeffR = MSADPCM_CoeffSet[*src++]; coeffR = MSADPCM_CoeffSet[*src++];
ideltaL = R16(src); src += 2; ideltaL = R16(src); src += 2;