[PATCH] dinput: Limit axes remap and fix loop variable in the js driver

Bruno Jesus bjesus at codeweavers.com
Tue Jun 13 01:06:05 CDT 2017


Tested with the Xbox 360 controller, Wii Classic controler, PS2 controller + usb converter and a virtual device with 24 axes.

Fixes https://bugs.winehq.org/show_bug.cgi?id=43120

Signed-off-by: Bruno Jesus <bjesus at codeweavers.com>
---
 dlls/dinput/joystick_linux.c | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/dlls/dinput/joystick_linux.c b/dlls/dinput/joystick_linux.c
index 1032659621..dea8f17324 100644
--- a/dlls/dinput/joystick_linux.c
+++ b/dlls/dinput/joystick_linux.c
@@ -253,9 +253,11 @@ static INT find_joystick_devices(void)
                 /* If no axes were configured but there are axes assume a 1-to-1 (wii controller) */
                 if (joydev.axis_count && !found_axes)
                 {
+                    int axes_limit = min(joydev.axis_count, 8); /* generic driver limit */
+
                     ERR("Incoherent joystick data, advertised %d axes, detected 0. Assuming 1-to-1.\n",
                          joydev.axis_count);
-                    for (j = 0; j < joydev.axis_count; j++)
+                    for (j = 0; j < axes_limit; j++)
                         joydev.dev_axes_map[j] = j;
                 }
             }
@@ -472,7 +474,7 @@ static HRESULT alloc_device(REFGUID rguid, IDirectInputImpl *dinput,
     df->dwNumObjs = newDevice->generic.devcaps.dwAxes + newDevice->generic.devcaps.dwPOVs + newDevice->generic.devcaps.dwButtons;
     if (!(df->rgodf = HeapAlloc(GetProcessHeap(), 0, df->dwNumObjs * df->dwObjSize))) goto FAILED;
 
-    for (i = 0; i < newDevice->generic.device_axis_count; i++)
+    for (i = 0; i < newDevice->generic.devcaps.dwAxes; i++)
     {
         int wine_obj = newDevice->generic.axis_map[i];
 
-- 
2.11.0




More information about the wine-patches mailing list