We are currently migrating Bugzilla to GitHub issues.
Any changes made to the bug tracker now will be lost, so please do not post new bugs or make changes to them.
When we're done, all bug URLs will redirect to their equivalent location on the new bug tracker.

Bug 672

Summary: _EFF_PositionDeinit doesn't free memory correctly and can only be called once
Product: SDL_mixer Reporter: Luke Kenneth Casson Leighton <lkcl>
Component: miscAssignee: Ryan C. Gordon <icculus>
Status: RESOLVED FIXED QA Contact: Sam Lantinga <slouken>
Severity: normal    
Priority: P2    
Version: 1.2.8   
Hardware: x86   
OS: Linux   

Description Luke Kenneth Casson Leighton 2009-01-07 05:14:55 UTC
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=510971

the developer of d2x-xl has tracked down a problem with _Eff_PositionDeinit
and has fixed it with the following code:

void _Eff_PositionDeinit(void)
{
    int i;

     if (pos_args_array) {
        for (i = 0; i < position_channels; i++)
            if (pos_args_array[i])
              free(pos_args_array[i]);
        free(pos_args_array);
         pos_args_array = NULL;
        }
     position_channels = 0;
     if (pos_args_global) {
        free(pos_args_global);
        pos_args_global = NULL;
        }
}

Debian patches the same function but the patch method is not as robust
as the above code from the d2x-xl developer.  as you can see, everything
is re-initialised so that the library can be used again.

he d2x-xl developer is having to advise people to install a custom-built
version of libsdl-mixer due to this bug!
Comment 1 Ryan C. Gordon 2009-01-07 12:53:54 UTC
The current code in Subversion looks like this...

void _Eff_PositionDeinit(void)
{
    int i;
    for (i = 0; i < position_channels; i++) {
        free(pos_args_array[i]);
    }

    position_channels = 0;

    free(pos_args_global);
    pos_args_global = NULL;
    free(pos_args_array);
    pos_args_array = NULL;
}

...it should give the same results.

The latest change was the addition of "position_channels = 0;" 11 months ago, but we haven't released an SDL_mixer 1.2.9 with the change.

--ryan.