]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
HID: wacom: Interpret tilt data from Intuos Pro BT as signed values
authorJason Gerecke <jason.gerecke@wacom.com>
Mon, 28 Oct 2024 17:39:14 +0000 (10:39 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 14 Dec 2024 18:51:17 +0000 (19:51 +0100)
commit 49a397ad24ee5e2c53a59dada2780d7e71bd3f77 upstream.

The tilt data contained in the Bluetooth packets of an Intuos Pro are
supposed to be interpreted as signed values. Simply casting the values
to type `char` is not guaranteed to work since it is implementation-
defined whether it is signed or unsigned. At least one user has noticed
the data being reported incorrectly on their system. To ensure that the
data is interpreted properly, we specifically cast to `signed char`
instead.

Link: https://github.com/linuxwacom/input-wacom/issues/445
Fixes: 4922cd26f03c ("HID: wacom: Support 2nd-gen Intuos Pro's Bluetooth classic interface")
CC: stable@vger.kernel.org # 4.11+
Signed-off-by: Jason Gerecke <jason.gerecke@wacom.com>
Signed-off-by: Jiri Kosina <jkosina@suse.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/hid/wacom_wac.c

index 438c9f6d21d9021e32c3b558133990dff2907b41..9a82cd124918f58e779018955c7ae2e387a1cb2d 100644 (file)
@@ -1401,9 +1401,9 @@ static void wacom_intuos_pro2_bt_pen(struct wacom_wac *wacom)
                                        rotation -= 1800;
 
                                input_report_abs(pen_input, ABS_TILT_X,
-                                                (char)frame[7]);
+                                                (signed char)frame[7]);
                                input_report_abs(pen_input, ABS_TILT_Y,
-                                                (char)frame[8]);
+                                                (signed char)frame[8]);
                                input_report_abs(pen_input, ABS_Z, rotation);
                                input_report_abs(pen_input, ABS_WHEEL,
                                                 get_unaligned_le16(&frame[11]));