Thread (1 message) 1 message, 1 author, 2020-03-09

Re: [PATCH] usb: musb: fix crash with highmen PIO and usbmon

From: Måns Rullgård <hidden>
Date: 2020-03-09 14:50:44
Also in: lkml

Bin Liu [off-list ref] writes:
Hi Mans,

On Sat, Mar 07, 2020 at 01:07:20PM +0000, Mans Rullgard wrote:
quoted
When handling a PIO bulk transfer with highmem buffer, a temporary
mapping is assigned to urb->transfer_buffer.  After the transfer is
complete, an invalid address is left behind in this pointer.  This is
not ordinarily a problem since nothing touches that buffer before the
urb is released.  However, when usbmon is active, usbmon_urb_complete()
calls (indirectly) mon_bin_get_data() which does access the transfer
buffer if it is set.  To prevent an invalid memory access here, reset
urb->tranfer_buffer to NULL when finished.

Fixes: 8e8a55165469 ("usb: musb: host: Handle highmem in PIO mode")
Signed-off-by: Mans Rullgard <redacted>
Thanks for fixing the bug.
quoted
---
 drivers/usb/musb/musb_host.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/drivers/usb/musb/musb_host.c b/drivers/usb/musb/musb_host.c
index 1c813c37462a..b67b40de1947 100644
--- a/drivers/usb/musb/musb_host.c
+++ b/drivers/usb/musb/musb_host.c
@@ -1459,8 +1459,10 @@ void musb_host_tx(struct musb *musb, u8 epnum)
 	qh->segsize = length;
 
 	if (qh->use_sg) {
-		if (offset + length >= urb->transfer_buffer_length)
+		if (offset + length >= urb->transfer_buffer_length) {
 			qh->use_sg = false;
+			urb->transfer_buffer = NULL;
+		}
In this tx case, can you directly pass qh->sg_miter.addr to
musb_write_fifo() so that urb->transfer_buffer is not touched at all?
Yes, that seems to work.  I'll prepare a new patch.

-- 
Måns Rullgård
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help