[PATCH 2/3] Input: xpad - add sdata_check() to xpad controllers
From: Griffin Kroah-Hartman <hidden>
Date: 2026-08-03 15:07:33
Also in:
lkml
Subsystem:
input (keyboard, mouse, joystick, touchscreen) drivers, the rest · Maintainers:
Dmitry Torokhov, Linus Torvalds
Add the sdata_check() safety wrapper to the xpad_process_packet() branch. Which should include the original Xbox Controller. Suggested-by: Ingo Molnar <mingo@kernel.org> Suggested-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> Signed-off-by: Griffin Kroah-Hartman <redacted> --- drivers/input/joystick/xpad.c | 50 ++++++++++++++++++++++++------------------- 1 file changed, 28 insertions(+), 22 deletions(-)
diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c
index c516860711a8..319a4c4a695f 100644
--- a/drivers/input/joystick/xpad.c
+++ b/drivers/input/joystick/xpad.c@@ -813,9 +813,13 @@ static void xpad360w_poweroff_controller(struct usb_xpad *xpad); * The used report descriptor was taken from ITO Takayuki's website: * http://euc.jp/periphs/xbox-controller.ja.html */ -static void xpad_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char *data) +static void xpad_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char *data, u32 len) { struct input_dev *dev = xpad->dev; + struct safe_data sdata; + + sdata.data = data; + sdata.len = len; if (!(xpad->mapping & MAP_STICKS_TO_NULL)) { /* left stick */
@@ -833,42 +837,44 @@ static void xpad_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char *d /* triggers left/right */ if (xpad->mapping & MAP_TRIGGERS_TO_BUTTONS) { - input_report_key(dev, BTN_TL2, data[10]); - input_report_key(dev, BTN_TR2, data[11]); + input_report_key(dev, BTN_TL2, sdata_check(&sdata, 10)); + input_report_key(dev, BTN_TR2, sdata_check(&sdata, 11)); } else { - input_report_abs(dev, ABS_Z, data[10]); - input_report_abs(dev, ABS_RZ, data[11]); + input_report_abs(dev, ABS_Z, sdata_check(&sdata, 10)); + input_report_abs(dev, ABS_RZ, sdata_check(&sdata, 11)); } /* digital pad */ if (xpad->mapping & MAP_DPAD_TO_BUTTONS) { /* dpad as buttons (left, right, up, down) */ - input_report_key(dev, BTN_DPAD_LEFT, data[2] & BIT(2)); - input_report_key(dev, BTN_DPAD_RIGHT, data[2] & BIT(3)); - input_report_key(dev, BTN_DPAD_UP, data[2] & BIT(0)); - input_report_key(dev, BTN_DPAD_DOWN, data[2] & BIT(1)); + input_report_key(dev, BTN_DPAD_LEFT, sdata_check(&sdata, 2) & BIT(2)); + input_report_key(dev, BTN_DPAD_RIGHT, sdata_check(&sdata, 2) & BIT(3)); + input_report_key(dev, BTN_DPAD_UP, sdata_check(&sdata, 2) & BIT(0)); + input_report_key(dev, BTN_DPAD_DOWN, sdata_check(&sdata, 2) & BIT(1)); } else { input_report_abs(dev, ABS_HAT0X, - !!(data[2] & 0x08) - !!(data[2] & 0x04)); + !!(sdata_check(&sdata, 2) & 0x08) - + !!(sdata_check(&sdata, 2) & 0x04)); input_report_abs(dev, ABS_HAT0Y, - !!(data[2] & 0x02) - !!(data[2] & 0x01)); + !!(sdata_check(&sdata, 2) & 0x02) - + !!(sdata_check(&sdata, 2) & 0x01)); } /* start/back buttons and stick press left/right */ - input_report_key(dev, BTN_START, data[2] & BIT(4)); - input_report_key(dev, BTN_SELECT, data[2] & BIT(5)); - input_report_key(dev, BTN_THUMBL, data[2] & BIT(6)); - input_report_key(dev, BTN_THUMBR, data[2] & BIT(7)); + input_report_key(dev, BTN_START, sdata_check(&sdata, 2) & BIT(4)); + input_report_key(dev, BTN_SELECT, sdata_check(&sdata, 2) & BIT(5)); + input_report_key(dev, BTN_THUMBL, sdata_check(&sdata, 2) & BIT(6)); + input_report_key(dev, BTN_THUMBR, sdata_check(&sdata, 2) & BIT(7)); /* "analog" buttons A, B, X, Y */ - input_report_key(dev, BTN_A, data[4]); - input_report_key(dev, BTN_B, data[5]); - input_report_key(dev, BTN_X, data[6]); - input_report_key(dev, BTN_Y, data[7]); + input_report_key(dev, BTN_A, sdata_check(&sdata, 4)); + input_report_key(dev, BTN_B, sdata_check(&sdata, 5)); + input_report_key(dev, BTN_X, sdata_check(&sdata, 6)); + input_report_key(dev, BTN_Y, sdata_check(&sdata, 7)); /* "analog" buttons black, white */ - input_report_key(dev, BTN_C, data[8]); - input_report_key(dev, BTN_Z, data[9]); + input_report_key(dev, BTN_C, sdata_check(&sdata, 8)); + input_report_key(dev, BTN_Z, sdata_check(&sdata, 9)); input_sync(dev);
@@ -1265,7 +1271,7 @@ static void xpad_irq_in(struct urb *urb) xpadone_process_packet(xpad, 0, xpad->idata, urb->actual_length); break; default: - xpad_process_packet(xpad, 0, xpad->idata); + xpad_process_packet(xpad, 0, xpad->idata, urb->actual_length); } exit:
--
2.55.0