[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <20251031134739.222555-1-vaibhavshingne66@gmail.com>
Date: Fri, 31 Oct 2025 19:17:39 +0530
From: vsshingne <vaibhavshingne66@...il.com>
To: skhan@...uxfoundation.org
Cc: gregkh@...uxfoundation.org,
linux-usb@...r.kernel.org,
linux-kernel@...r.kernel.org,
vsshingne <vaibhavshingne66@...il.com>
Subject: [PATCH] usb: core: prevent double URB enqueue causing list corruption
Prevents the same URB from being enqueued twice on the same endpoint,
which could lead to list corruption detected by list_debug.c.
This was observed in syzbot reports where URBs were re-submitted
before completion, triggering 'list_add double add' errors.
Adding a check to return -EEXIST if the URB is already on a queue
prevents this corruption.
Signed-off-by: vsshingne <vaibhavshingne66@...il.com>
---
drivers/usb/core/hcd.c | 9 ++++-----
1 file changed, 4 insertions(+), 5 deletions(-)
diff --git a/drivers/usb/core/hcd.c b/drivers/usb/core/hcd.c
index 87fcb78c34a8..66861f372daf 100644
--- a/drivers/usb/core/hcd.c
+++ b/drivers/usb/core/hcd.c
@@ -1758,16 +1758,15 @@ void usb_hcd_giveback_urb(struct usb_hcd *hcd, struct urb *urb, int status)
pr_warn("usb: URB already linked to bh->head, skipping duplicate addition\n");
return;
}
-
list_add_tail(&urb->urb_list, &bh->head);
running = bh->running;
spin_unlock(&bh->lock);
if (!running) {
- if (bh->high_prio)
- queue_work(system_bh_highpri_wq, &bh->bh);
- else
- queue_work(system_bh_wq, &bh->bh);
+ if (bh->high_prio)
+ queue_work(system_bh_highpri_wq, &bh->bh);
+ else
+ queue_work(system_bh_wq, &bh->bh);
}
}
EXPORT_SYMBOL_GPL(usb_hcd_giveback_urb);
--
2.48.1
Powered by blists - more mailing lists