Linux USB
 help / color / mirror / Atom feed
* [RESEND PATCH] usbip: vudc: fix NULL pointer dereference in vep_dequeue()
@ 2026-07-02  8:12 raoxu
  2026-07-02  8:38 ` Greg KH
  0 siblings, 1 reply; 2+ messages in thread
From: raoxu @ 2026-07-02  8:12 UTC (permalink / raw)
  To: valentina.manea.m; +Cc: shuah, gregkh, i, linux-usb, linux-kernel, raoxu

From: Xu Rao <raoxu@uniontech.com>

vep_alloc_request() zero-initializes struct vrequest but never assigns
vrequest::udc. vep_dequeue() then reads that field and dereferences it
while checking udc->driver. Consequently, any usb_ep_dequeue() call that
reaches the vUDC dequeue operation can crash the kernel.

The endpoint passed to ->dequeue() identifies both the request queue
being searched and the owning vUDC. Derive the controller from that
endpoint with ep_to_vudc(), as the other endpoint operations do.

After this change, vrequest::udc has no users. Remove the redundant
controller backpointer.

Fixes: b6a0ca111867 ("usbip: vudc: Add UDC specific ops")
Signed-off-by: Xu Rao <raoxu@uniontech.com>
---
 drivers/usb/usbip/vudc.h     | 1 -
 drivers/usb/usbip/vudc_dev.c | 4 +---
 2 files changed, 1 insertion(+), 4 deletions(-)

diff --git a/drivers/usb/usbip/vudc.h b/drivers/usb/usbip/vudc.h
index faf61c9c6a98..5ef0e7d9b23a 100644
--- a/drivers/usb/usbip/vudc.h
+++ b/drivers/usb/usbip/vudc.h
@@ -38,7 +38,6 @@ struct vep {

 struct vrequest {
 	struct usb_request req;
-	struct vudc *udc;
 	struct list_head req_entry; /* Request queue */
 };

diff --git a/drivers/usb/usbip/vudc_dev.c b/drivers/usb/usbip/vudc_dev.c
index c5f079c5a1ea..5ef88117965d 100644
--- a/drivers/usb/usbip/vudc_dev.c
+++ b/drivers/usb/usbip/vudc_dev.c
@@ -333,7 +333,6 @@ static int vep_queue(struct usb_ep *_ep, struct usb_request *_req,
 static int vep_dequeue(struct usb_ep *_ep, struct usb_request *_req)
 {
 	struct vep *ep;
-	struct vrequest *req;
 	struct vudc *udc;
 	struct vrequest *lst;
 	unsigned long flags;
@@ -343,8 +342,7 @@ static int vep_dequeue(struct usb_ep *_ep, struct usb_request *_req)
 		return ret;

 	ep = to_vep(_ep);
-	req = to_vrequest(_req);
-	udc = req->udc;
+	udc = ep_to_vudc(ep);

 	if (!udc->driver)
 		return -ESHUTDOWN;
--
2.50.1


^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [RESEND PATCH] usbip: vudc: fix NULL pointer dereference in vep_dequeue()
  2026-07-02  8:12 [RESEND PATCH] usbip: vudc: fix NULL pointer dereference in vep_dequeue() raoxu
@ 2026-07-02  8:38 ` Greg KH
  0 siblings, 0 replies; 2+ messages in thread
From: Greg KH @ 2026-07-02  8:38 UTC (permalink / raw)
  To: raoxu; +Cc: valentina.manea.m, shuah, i, linux-usb, linux-kernel

On Thu, Jul 02, 2026 at 04:12:32PM +0800, raoxu wrote:
> From: Xu Rao <raoxu@uniontech.com>
> 
> vep_alloc_request() zero-initializes struct vrequest but never assigns
> vrequest::udc. vep_dequeue() then reads that field and dereferences it
> while checking udc->driver. Consequently, any usb_ep_dequeue() call that
> reaches the vUDC dequeue operation can crash the kernel.
> 
> The endpoint passed to ->dequeue() identifies both the request queue
> being searched and the owning vUDC. Derive the controller from that
> endpoint with ep_to_vudc(), as the other endpoint operations do.
> 
> After this change, vrequest::udc has no users. Remove the redundant
> controller backpointer.
> 
> Fixes: b6a0ca111867 ("usbip: vudc: Add UDC specific ops")
> Signed-off-by: Xu Rao <raoxu@uniontech.com>
> ---
>  drivers/usb/usbip/vudc.h     | 1 -
>  drivers/usb/usbip/vudc_dev.c | 4 +---
>  2 files changed, 1 insertion(+), 4 deletions(-)

Why is this a RESEND?


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2026-07-02  8:44 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-02  8:12 [RESEND PATCH] usbip: vudc: fix NULL pointer dereference in vep_dequeue() raoxu
2026-07-02  8:38 ` Greg KH

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox