msadpcm32.acm: Stop converting data instead of crashing (try 2)

Andrew Eikum aeikum at codeweavers.com
Wed Sep 30 10:42:23 CDT 2015


On Tue, Sep 29, 2015 at 10:06:21PM +0800, Bruno Jesus wrote:
> Signed-off-by: Bruno Jesus <00cpxxx at gmail.com>
> 

Signed-off-by: Andrew Eikum <aeikum at codeweavers.com>

> try 2:
> Downgrade a ERR to WARN as requested by Andrew Eikum.
> 
> Tomb Raider 3 uses a single archive with all wav files inside, when
> playing some specific sounds it passes incorrect lengths of data that
> reach the next wav file header. This causes an assert in the code that
> is now gracefully handled.
> 
> Fixes bug https://bugs.winehq.org/show_bug.cgi?id=21000

> diff --git a/dlls/msadp32.acm/msadp32.c b/dlls/msadp32.acm/msadp32.c
> index 2c61575..24e0c6a 100644
> --- a/dlls/msadp32.acm/msadp32.c
> +++ b/dlls/msadp32.acm/msadp32.c
> @@ -249,9 +249,17 @@ static	void cvtSSms16K(const ACMDRVSTREAMINSTANCE *adsi,
>      {
>          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++];
> -        assert(*src <= 6);
>          coeffR = MSADPCM_CoeffSet[*src++];
>  
>          ideltaL  = R16(src);    src += 2;

> 




More information about the wine-patches mailing list