SDL/src
Sam Lantinga bdc6e4ffc5 Fixed bug 5195 - Replugging in "mixed" controller types crashes on macOS
RustyM

This is related to Bug 5034, but crashes under a somewhat different condition.

In the latest tip (changeset 13914) or with the SDL 2.0.12 source + David?s 5034 patch, unplugging and then replugging in certain controller types on macOS will crash. A mix of new controllers like Switch Pro, PS4 and Xbox One all work without issue. But if a controller without a rumble function, like many SNES retro USB gamepads, is mixed with a PS4 or Switch Pro controller it will crash.

File: joystick/darwin/SDL_sysjoystick.c
Function: static recDevice *FreeDevice(recDevice *removeDevice)
On line 159: while (device->pNext != removeDevice) {
Causes: Thread 1: EXC_BAD_ACCESS (code=1, address=0x188)

This can be reproduced in testgamecontroller" by starting the test program with both a ?retro? controller plugged in and a ?modern rumble? controller (Switch Pro/PS4). This may crash on launch, but it depends on which controller ends up as device 0. If it doesn?t crash, unplug the ?modern rumble? controller and plug it back in.

Some of the "retro" controllers I?ve seen this crash with:
- iBuffalo SNES Controller
- 8Bitdo SN30 Gamepad (in MacOS mode)
- Retrolink NES Controller
- HuiJia SNES Controller Adaptor

The issue appears macOS specific. Seen on 10.12.6 and 10.14.6. Not seen on Windows 10.

The while loop in FreeDevice() assumes that every device is not NULL.

    recDevice *device = gpDeviceList;
    while (device->pNext != removeDevice) {
        device = device->pNext;
    }
    device->pNext = pDeviceNext;

So maybe we should check for NULL here? Or instead prevent adding NULL devices to the list in the first place? Checking device for NULL before entering the loop appears to work.

    recDevice *device = gpDeviceList;
    if (!device) {
        while (device->pNext != removeDevice) {
            device = device->pNext;
        }
    }
    device->pNext = pDeviceNext;
2021-01-14 15:03:11 -08:00
..
atomic Use specific acquire and release variants of InterlockedExchange on ARM 2021-01-03 12:13:40 -06:00
audio Fixed bug 5080 - SDL_netbsdaudio: Always use the device's preferred frequency 2021-01-08 10:09:37 -08:00
core Fixed bug 5461 - Add rewritten WSCONS driver for OpenBSD 2021-01-14 14:32:11 -08:00
cpuinfo Updated copyright for 2021 2021-01-02 10:25:38 -08:00
dynapi ran gendynapi.pl after SDL_UpdateNVTexture addition 2021-01-05 15:15:50 +03:00
events Fixed bug 5465 - Invalid memcpy inside SDL_GestureDelTouch (Thanks dmikushin and Yuki Okumura) 2021-01-10 22:21:12 +01:00
file Updated copyright for 2021 2021-01-02 10:25:38 -08:00
filesystem use WIN_StringToUTF8W instead of WIN_StringToUTF8 where needed (#2) 2021-01-05 15:50:02 +03:00
haptic Updated copyright for 2021 2021-01-02 10:25:38 -08:00
hidapi Fixed building when SDL_LIBUSB_DYNAMIC is defined 2021-01-07 10:23:55 -08:00
joystick Fixed bug 5195 - Replugging in "mixed" controller types crashes on macOS 2021-01-14 15:03:11 -08:00
libm Updated copyright for 2021 2021-01-02 10:25:38 -08:00
loadso Updated copyright for 2021 2021-01-02 10:25:38 -08:00
locale consistently use TEXT() macro with LoadLibrary() and GetModuleHandle() 2021-01-04 01:23:50 +03:00
main SDL_windows_main.c: use new WIN_StringToUTF8W macro 2021-01-04 10:20:10 +03:00
misc use WIN_StringToUTF8W instead of WIN_StringToUTF8 where needed (#2) 2021-01-05 15:50:02 +03:00
power Updated copyright for 2021 2021-01-02 10:25:38 -08:00
render opengl: More work on making line drawing match software renderer. 2021-01-11 20:40:11 -05:00
sensor use WIN_StringToUTF8W instead of WIN_StringToUTF8 where needed (#2) 2021-01-05 15:50:02 +03:00
stdlib Updated copyright for 2021 2021-01-02 10:25:38 -08:00
test Updated copyright for 2021 2021-01-02 10:25:38 -08:00
thread use WIN_StringToUTF8W instead of WIN_StringToUTF8 where needed (#2) 2021-01-05 15:50:02 +03:00
timer Updated copyright for 2021 2021-01-02 10:25:38 -08:00
video Fixed bug 5451 - Can't create EGLSurface in Wayland from SDLWindow (no EGLNativeWindow pointer) 2021-01-14 14:42:53 -08:00
SDL.c Updated copyright for 2021 2021-01-02 10:25:38 -08:00
SDL_assert.c Updated copyright for 2021 2021-01-02 10:25:38 -08:00
SDL_assert_c.h Updated copyright for 2021 2021-01-02 10:25:38 -08:00
SDL_dataqueue.c Updated copyright for 2021 2021-01-02 10:25:38 -08:00
SDL_dataqueue.h Updated copyright for 2021 2021-01-02 10:25:38 -08:00
SDL_error.c Updated copyright for 2021 2021-01-02 10:25:38 -08:00
SDL_error_c.h Updated copyright for 2021 2021-01-02 10:25:38 -08:00
SDL_hints.c Updated copyright for 2021 2021-01-02 10:25:38 -08:00
SDL_hints_c.h Updated copyright for 2021 2021-01-02 10:25:38 -08:00
SDL_internal.h Updated copyright for 2021 2021-01-02 10:25:38 -08:00
SDL_log.c Updated copyright for 2021 2021-01-02 10:25:38 -08:00