]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
HID: pidff: Do not set out of range trigger button
authorTomasz Pakuła <tomasz.pakula.oficjalny@gmail.com>
Sat, 29 Nov 2025 18:46:14 +0000 (19:46 +0100)
committerJiri Kosina <jkosina@suse.com>
Sat, 10 Jan 2026 09:06:48 +0000 (10:06 +0100)
Some games (mainly observed with Kylotonn's WRC Serises) set trigger
button to a random value, or always the same one, out of range.
I observed 307 and other values but, for example, my Moza R9 only
exposes 128 buttons AND it's trigger button field is 8-bit. This causes
errors to appear in dmesg.

Only set the trigger button and trigger interval in the trigger button
is in range of the field.

Signed-off-by: Tomasz Pakuła <tomasz.pakula.oficjalny@gmail.com>
Signed-off-by: Jiri Kosina <jkosina@suse.com>
drivers/hid/usbhid/hid-pidff.c

index 95377c5f63356b067379b754a02f7524df770d8d..a4e700b40ba9b48ae3fda4001d2acf3200ff7445 100644 (file)
@@ -523,9 +523,19 @@ static void pidff_set_effect_report(struct pidff_device *pidff,
        pidff_set_duration(&pidff->set_effect[PID_DURATION],
                           effect->replay.length);
 
-       pidff->set_effect[PID_TRIGGER_BUTTON].value[0] = effect->trigger.button;
-       pidff_set_time(&pidff->set_effect[PID_TRIGGER_REPEAT_INT],
-                      effect->trigger.interval);
+       /* Some games set this to random values that can be out of range */
+       s32 trigger_button_max =
+               pidff->set_effect[PID_TRIGGER_BUTTON].field->logical_maximum;
+       if (effect->trigger.button <= trigger_button_max) {
+               pidff->set_effect[PID_TRIGGER_BUTTON].value[0] =
+                       effect->trigger.button;
+               pidff_set_time(&pidff->set_effect[PID_TRIGGER_REPEAT_INT],
+                              effect->trigger.interval);
+       } else {
+               pidff->set_effect[PID_TRIGGER_BUTTON].value[0] = 0;
+               pidff->set_effect[PID_TRIGGER_REPEAT_INT].value[0] = 0;
+       }
+
        pidff->set_effect[PID_GAIN].value[0] =
                pidff->set_effect[PID_GAIN].field->logical_maximum;