• Sam Lantinga's avatar
    Fixed bug 1014 - SDL_ConvertAudio crashes · a9bcdb83
    Sam Lantinga authored
    The patch Mark attached looks good and valgrind gives it a clean bill of health:
    
    Mark.Howson@ntu.ac.uk 2010-12-15 07:45:25 PST
    
    Reproducible here under Windows and Linux. Looking at the code for
    SDL_Upsample_S16LSB_2c:
    
    const int dstsize = (int) (((double)cvt->len_cvt) * cvt->rate_incr);
    Sint16 *dst = ((Sint16 *) (cvt->buf + dstsize)) - 2;
    const Sint16 *target = ((const Sint16 *) cvt->buf) - 2;
    while (dst > target) {
       dst[1] = ((Sint16) SDL_SwapLE16(sample1));
       dst[0] = ((Sint16) SDL_SwapLE16(sample0));
       dst -= 2;
    ...
    
    if dstsize is odd (and therefore dst), it'll write to target[1] which is one
    byte before the allocated buf.
    
    The attached patch to sdlgenaudiocvt.pl changes dst > target to dst >= target,
    and removes the - $channels for the upsample case. The patch is not fully
    tested, but seems to work here.
    a9bcdb83
SDL_audiotypecvt.c 604 KB