[PATCH] joy.cpl: Check if effect is allocated before releasing it

Tim Schumacher timschumi at gmx.de
Sun May 19 05:55:21 CDT 2019


Hello Alistair,

I thought about fixing the problem that way (since it would be
the cleaner solution), but the length of the effects array is
determined by the num_effects value (which the destroy loop
depends on as well), and that value isn't affected by effects
failing to be created.

Therefore, we are going to end up with some empty fields, no matter
what we do, so I thought this would be the best solution (unless
decrementing num_effects when a failure occurs and moving the null
fields to the end of the array (hoping that nothing ever accesses
them) is an acceptable solution).

Tim

On 19.05.19 10:49, Alistair Leslie-Hughes wrote:
> Hi Tim,
>
> It would be better to stop the adding of NULL effects.
>
> function ff_effects_callback
>
> hr = IDirectInputDevice2_CreateEffect(
>          joystick->device, &pdei->guid, &dieffect,
> &joystick->effects[joystick->cur_effect].effect, NULL);
>
> /* hr is assigned but never checked. */
>
>
> Best Regards
>
> Alistair.
>
> On 19/5/19 5:02 am, Tim Schumacher wrote:
>> Since IDirectInputEffect_Release(obj) is just a macro for (obj)->Release(),
>> the program crashes if the effect we are trying to release is null.
>> This mostly happens when the effect failed to allocate in the first place.
>>
>> Signed-off-by: Tim Schumacher <timschumi at gmx.de>
>> ---
>>   dlls/joy.cpl/main.c | 3 ++-
>>   1 file changed, 2 insertions(+), 1 deletion(-)
>>
>> diff --git a/dlls/joy.cpl/main.c b/dlls/joy.cpl/main.c
>> index 9768917641..06084f3166 100644
>> --- a/dlls/joy.cpl/main.c
>> +++ b/dlls/joy.cpl/main.c
>> @@ -137,7 +137,8 @@ static void destroy_joysticks(struct JoystickData *data)
>>           if (data->joysticks[i].forcefeedback && data->joysticks[i].num_effects > 0)
>>           {
>>               for (j = 0; j < data->joysticks[i].num_effects; j++)
>> -                IDirectInputEffect_Release(data->joysticks[i].effects[j].effect);
>> +                if (data->joysticks[i].effects[j].effect)
>> +                    IDirectInputEffect_Release(data->joysticks[i].effects[j].effect);
>>
>>               HeapFree(GetProcessHeap(), 0, data->joysticks[i].effects);
>>           }
>> --
>> 2.21.0
>>
>>
>>



More information about the wine-devel mailing list