# UNDF: UNDF-2026-000000157 --- a/src/modules/joystick/sdl/JoystickModule.h +++ b/src/modules/joystick/sdl/JoystickModule.h @@ -68,7 +68,8 @@ private: std::list joysticks; std::vector activeSticks; + std::unordered_map activeSticksById; std::map recentGamepadGUIDs; }; --- a/src/modules/joystick/sdl/JoystickModule.cpp +++ b/src/modules/joystick/sdl/JoystickModule.cpp @@ -98,13 +98,11 @@ love::joystick::Joystick *JoystickModule::getJoystickFromID(int instanceid) { - for (auto stick : activeSticks) - { - if (stick->getInstanceID() == instanceid) - return stick; - } - - return nullptr; + // CWE-407 fix: O(1) hash map lookup instead of O(n) linear scan. + auto it = activeSticksById.find(instanceid); + return (it != activeSticksById.end()) ? it->second : nullptr; } love::joystick::Joystick *JoystickModule::addJoystick(int64 deviceid) @@ -160,6 +158,7 @@ love::joystick::Joystick *JoystickModule::addJoystick(int64 deviceid) if (joystick->isGamepad()) recentGamepadGUIDs[joystick->getGUID()] = true; + activeSticksById[joystick->getInstanceID()] = joystick; activeSticks.push_back(joystick); return joystick; } @@ -171,6 +170,7 @@ void JoystickModule::removeJoystick(love::joystick::Joystick *joystick) // Close the Joystick and remove it from the active joystick list. auto it = std::find(activeSticks.begin(), activeSticks.end(), joystick); if (it != activeSticks.end()) { + activeSticksById.erase(joystick->getInstanceID()); (*it)->close(); activeSticks.erase(it); }