[PATCH v2 3/3] Input: xpad - add size checks to xpad360 packet processing
From: Griffin Kroah-Hartman
Date: Wed Aug 05 2026 - 06:01:05 EST
Add size checks to xbox360_process_packet() and
xbox360w_process_packet() to prevent OOB reads with the data[] array.
Signed-off-by: Griffin Kroah-Hartman <griffin@xxxxxxxxx>
---
drivers/input/joystick/xpad.c | 17 ++++++++++-------
1 file changed, 10 insertions(+), 7 deletions(-)
diff --git a/drivers/input/joystick/xpad.c b/drivers/input/joystick/xpad.c
index 83bc361b15f7..6f15eafc6477 100644
--- a/drivers/input/joystick/xpad.c
+++ b/drivers/input/joystick/xpad.c
@@ -870,10 +870,10 @@ static void xpad_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char *d
*/
static void xpad360_process_packet(struct usb_xpad *xpad, struct input_dev *dev,
- u16 cmd, unsigned char *data)
+ u16 cmd, unsigned char *data, u32 len)
{
/* valid pad data */
- if (data[0] != 0x00)
+ if (data[0] != 0x00 || len < 14)
return;
/* digital pad */
@@ -998,11 +998,14 @@ static void xpad_presence_work(struct work_struct *work)
* 01.1 - Pad state (Bytes 4+) valid
*
*/
-static void xpad360w_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char *data)
+static void xpad360w_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned char *data, u32 len)
{
struct input_dev *dev;
bool present;
+ if (len < 2)
+ return;
+
/* Presence change */
if (data[0] & 0x08) {
present = (data[1] & 0x80) != 0;
@@ -1019,8 +1022,8 @@ static void xpad360w_process_packet(struct usb_xpad *xpad, u16 cmd, unsigned cha
rcu_read_lock();
dev = rcu_dereference(xpad->x360w_dev);
- if (dev)
- xpad360_process_packet(xpad, dev, cmd, &data[4]);
+ if (dev && len > 4)
+ xpad360_process_packet(xpad, dev, cmd, &data[4], len - 4);
rcu_read_unlock();
}
@@ -1253,10 +1256,10 @@ static void xpad_irq_in(struct urb *urb)
switch (xpad->xtype) {
case XTYPE_XBOX360:
- xpad360_process_packet(xpad, xpad->dev, 0, xpad->idata);
+ xpad360_process_packet(xpad, xpad->dev, 0, xpad->idata, urb->actual_length);
break;
case XTYPE_XBOX360W:
- xpad360w_process_packet(xpad, 0, xpad->idata);
+ xpad360w_process_packet(xpad, 0, xpad->idata, urb->actual_length);
break;
case XTYPE_XBOXONE:
xpadone_process_packet(xpad, 0, xpad->idata, urb->actual_length);
--
2.55.0