SDL: Fix GameInput `QueryDeviceName` memory leaks

From 223490b0249385d26131fad83c774f4625d523df Mon Sep 17 00:00:00 2001
From: Nintorch <[EMAIL REDACTED]>
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 32a19b049d8c3..8032028815acf 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)