From 223490b0249385d26131fad83c774f4625d523df Mon Sep 17 00:00:00 2001 From: Nintorch <92302738+Nintorch@users.noreply.github.com> Date: Tue, 21 Jul 2026 12:22:32 +0500 Subject: [PATCH] Fix GameInput `QueryDeviceName` memory leaks --- src/joystick/gdk/SDL_gameinputjoystick.cpp | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/joystick/gdk/SDL_gameinputjoystick.cpp b/src/joystick/gdk/SDL_gameinputjoystick.cpp index 32a19b049d..8032028815 100644 --- a/src/joystick/gdk/SDL_gameinputjoystick.cpp +++ b/src/joystick/gdk/SDL_gameinputjoystick.cpp @@ -229,7 +229,7 @@ static void QueryDeviceName(const GameInputDeviceInfo *info, Uint16 vendor_id, U } } -static bool GAMEINPUT_InternalAddOrFind(IGameInputDevice *pDevice) +static void GAMEINPUT_InternalAddOrFind(IGameInputDevice *pDevice) { GAMEINPUT_InternalDevice **devicelist = NULL; GAMEINPUT_InternalDevice *elem = NULL; @@ -251,7 +251,8 @@ static bool GAMEINPUT_InternalAddOrFind(IGameInputDevice *pDevice) #if GAMEINPUT_API_VERSION >= 1 HRESULT hr = pDevice->GetDeviceInfo(&info); if (FAILED(hr)) { - return WIN_SetErrorFromHRESULT("IGameInputDevice::GetDeviceInfo", hr); + WIN_SetErrorFromHRESULT("IGameInputDevice::GetDeviceInfo", hr); + return; } #else info = pDevice->GetDeviceInfo(); @@ -272,13 +273,13 @@ static bool GAMEINPUT_InternalAddOrFind(IGameInputDevice *pDevice) if (IsXbox360WirelessAdapter(vendor, product) || SDL_ShouldIgnoreJoystick(vendor, product, version, product_string) || SDL_JoystickHandledByAnotherDriver(&SDL_GAMEINPUT_JoystickDriver, vendor, product, version, product_string)) { - return true; + goto done; } #if defined(SDL_JOYSTICK_DINPUT) && defined(SDL_HAPTIC_DINPUT) // This joystick backend currently doesn't provide a haptic backend, so fallback to DirectInput for haptic-capable devices. if (SDL_GetHintBoolean(SDL_HINT_JOYSTICK_DIRECTINPUT, true) && info->forceFeedbackMotorCount > 0 && pDevice->IsForceFeedbackMotorPoweredOn(0)) { - return true; + goto done; } #endif @@ -286,7 +287,7 @@ static bool GAMEINPUT_InternalAddOrFind(IGameInputDevice *pDevice) #if defined(SDL_JOYSTICK_DINPUT) // Let other backends handle non-gamepad controllers to possibly avoid bugs and/or regressions. if (SDL_GetHintBoolean(SDL_HINT_JOYSTICK_DIRECTINPUT, true)) { - return true; + goto done; } #endif if (info->supportedInput & GameInputKindController) { @@ -295,7 +296,7 @@ static bool GAMEINPUT_InternalAddOrFind(IGameInputDevice *pDevice) subtype = 0; } else { // This joystick backend currently doesn't provide proper reading of other joystick types. - return true; + goto done; } } @@ -304,19 +305,19 @@ static bool GAMEINPUT_InternalAddOrFind(IGameInputDevice *pDevice) if (elem && elem->device == pDevice) { // we're already added elem->isDeleteRequested = false; - return true; + goto done; } } elem = (GAMEINPUT_InternalDevice *)SDL_calloc(1, sizeof(*elem)); if (!elem) { - return false; + goto done; } devicelist = (GAMEINPUT_InternalDevice **)SDL_realloc(g_GameInputList.devices, sizeof(elem) * (g_GameInputList.count + 1LL)); if (!devicelist) { SDL_free(elem); - return false; + goto done; } // Generate a device path @@ -343,10 +344,9 @@ static bool GAMEINPUT_InternalAddOrFind(IGameInputDevice *pDevice) g_GameInputList.devices = devicelist; g_GameInputList.devices[g_GameInputList.count++] = elem; +done: SDL_free(manufacturer_string); SDL_free(product_string); - - return true; } static bool GAMEINPUT_InternalRemoveByIndex(int idx)