Fixed Bug 5034 - Replugging in a controller crashes on macOS in SDL 2.0.12

The Darwin/macOS joystick driver was freeing its joystick's hwdata field
without zeroing it out in any live instance of SDL_Joystick.
This commit is contained in:
David Ludwig 2020-03-16 19:24:25 -04:00
parent 47da53b91d
commit 197b14de4a
1 changed files with 13 additions and 0 deletions

View File

@ -125,6 +125,7 @@ static recDevice *
FreeDevice(recDevice *removeDevice)
{
recDevice *pDeviceNext = NULL;
SDL_Joystick *joystick = NULL;
if (removeDevice) {
if (removeDevice->deviceRef) {
IOHIDDeviceUnscheduleFromRunLoop(removeDevice->deviceRef, CFRunLoopGetCurrent(), SDL_JOYSTICK_RUNLOOP_MODE);
@ -146,6 +147,14 @@ FreeDevice(recDevice *removeDevice)
}
removeDevice->pNext = NULL;
/* clear out any reference to this recDevice that are being
* held by a live instance of SDL_Joystick
*/
joystick = SDL_JoystickFromInstanceID(removeDevice->instance_id);
if (joystick) {
joystick->hwdata = NULL;
}
/* free element lists */
FreeElementList(removeDevice->firstAxis);
FreeElementList(removeDevice->firstButton);
@ -871,6 +880,10 @@ DARWIN_JoystickRumble(SDL_Joystick * joystick, Uint16 low_frequency_rumble, Uint
/* Scale and average the two rumble strengths */
Sint16 magnitude = (Sint16)(((low_frequency_rumble / 2) + (high_frequency_rumble / 2)) / 2);
if (!device) {
return SDL_SetError("Rumble failed, device disconnected");
}
if (!device->ffservice) {
return SDL_Unsupported();
}