Forwarded: [PATCH] usb: fix UAF in raw_process_io_ep_io

From: syzbot

Date: Thu Oct 01 2026 - 18:54:35 EST


For archival purposes, forwarding an incoming command email to
linux-kernel@xxxxxxxxxxxxxxx.

***

Subject: [PATCH] usb: fix UAF in raw_process_io_ep_io
Author: drifabdelmalekmohamedsaid@xxxxxxxxx

#syz test

diff --git a/drivers/usb/gadget/legacy/raw_gadget.c b/drivers/usb/gadget/legacy/raw_gadget.c
index 4febf8dac7ca..6d33b99ce9a0 100644
--- a/drivers/usb/gadget/legacy/raw_gadget.c
+++ b/drivers/usb/gadget/legacy/raw_gadget.c
@@ -637,11 +637,11 @@ static int raw_ioctl_event_fetch(struct raw_dev *dev, unsigned long value)

event = raw_event_queue_fetch(&dev->queue);
if (PTR_ERR(event) == -EINTR) {
- dev_dbg(&dev->gadget->dev, "event fetching interrupted\n");
+ dev_dbg(dev->dev, "event fetching interrupted\n");
return -EINTR;
}
if (IS_ERR(event)) {
- dev_err(&dev->gadget->dev, "failed to fetch event\n");
+ dev_err(dev->dev, "failed to fetch event\n");
spin_lock_irqsave(&dev->lock, flags);
dev->state = STATE_DEV_FAILED;
spin_unlock_irqrestore(&dev->lock, flags);
@@ -727,7 +727,7 @@ static int raw_process_ep0_io(struct raw_dev *dev, struct usb_raw_ep_io *io,

ret = usb_ep_queue(dev->gadget->ep0, dev->req, GFP_KERNEL);
if (ret) {
- dev_err(&dev->gadget->dev,
+ dev_err(dev->dev,
"fail, usb_ep_queue returned %d\n", ret);
spin_lock_irqsave(&dev->lock, flags);
goto out_queue_failed;
@@ -735,7 +735,7 @@ static int raw_process_ep0_io(struct raw_dev *dev, struct usb_raw_ep_io *io,

ret = wait_for_completion_interruptible(&dev->ep0_done);
if (ret) {
- dev_dbg(&dev->gadget->dev, "wait interrupted\n");
+ dev_dbg(dev->dev, "wait interrupted\n");
usb_ep_dequeue(dev->gadget->ep0, dev->req);
wait_for_completion(&dev->ep0_done);
spin_lock_irqsave(&dev->lock, flags);
@@ -1113,7 +1113,7 @@ static int raw_process_ep_io(struct raw_dev *dev, struct usb_raw_ep_io *io,

ret = usb_ep_queue(ep->ep, ep->req, GFP_KERNEL);
if (ret) {
- dev_err(&dev->gadget->dev,
+ dev_err(dev->dev,
"fail, usb_ep_queue returned %d\n", ret);
spin_lock_irqsave(&dev->lock, flags);
goto out_queue_failed;
@@ -1121,7 +1121,7 @@ static int raw_process_ep_io(struct raw_dev *dev, struct usb_raw_ep_io *io,

ret = wait_for_completion_interruptible(&done);
if (ret) {
- dev_dbg(&dev->gadget->dev, "wait interrupted\n");
+ dev_dbg(dev->dev, "wait interrupted\n");
usb_ep_dequeue(ep->ep, ep->req);
wait_for_completion(&done);
spin_lock_irqsave(&dev->lock, flags);