[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20250311084111.322351-1-daixin_tkzc@163.com>
Date: Tue, 11 Mar 2025 16:41:11 +0800
From: Xin Dai <daixin_tkzc@....com>
To: stern@...land.harvard.edu
Cc: linux-usb@...r.kernel.org,
usb-storage@...ts.one-eyed-alien.net,
linux-kernel@...r.kernel.org,
Xin Dai <daixin_tkzc@....com>
Subject: [PATCH] usb: storage: Fix `us->iobuf` size for BOT transmission to prevent memory overflow
When the DWC2 controller detects a packet Babble Error, where a device
transmits more data over USB than the host controller anticipates for a
transaction. It follows this process:
1. The interrupt handler marks the transfer result of the URB as
`OVERFLOW` and returns it to the USB storage driver.
2. The USB storage driver interprets the data phase transfer result of
the BOT (Bulk-Only Transport) as `USB_STOR_XFER_LONG`.
3. The USB storage driver initiates the CSW (Command Status Wrapper)
phase of the BOT, requests an IN transaction, and retrieves the
execution status of the corresponding CBW (Command Block Wrapper)
command.
4. The USB storage driver evaluates the CSW and finds it does not meet
expectations. It marks the entire BOT transfer result as
`USB_STOR_XFER_ERROR` and notifies the SCSI layer that a `DID_ERROR`
has occurred during the transfer.
5. The USB storage driver requests the DWC2 controller to initiate a
port reset, notifying the device of an issue with the previous
transmission.
6. The SCSI layer implements a retransmission mechanism.
In step 3, the device remains unaware of the Babble Error until the
connected port is reset. We observed that the device continues to send
512 bytes of data to the host (according to the BBB Transport protocol,
it should send only 13 bytes). However, the USB storage driver
pre-allocates a default buffer size of 64 bytes for CBW/CSW, posing a
risk of memory overflow. To mitigate this risk, we have adjusted the
buffer size to 512 bytes to prevent potential errors.
Signed-off-by: Xin Dai <daixin_tkzc@....com>
---
drivers/usb/storage/usb.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/usb/storage/usb.h b/drivers/usb/storage/usb.h
index 97c6196d639b..fd8dcb21137a 100644
--- a/drivers/usb/storage/usb.h
+++ b/drivers/usb/storage/usb.h
@@ -71,7 +71,7 @@ struct us_unusual_dev {
* size we'll allocate.
*/
-#define US_IOBUF_SIZE 64 /* Size of the DMA-mapped I/O buffer */
+#define US_IOBUF_SIZE 512 /* Size of the DMA-mapped I/O buffer */
#define US_SENSE_SIZE 18 /* Size of the autosense data buffer */
typedef int (*trans_cmnd)(struct scsi_cmnd *, struct us_data*);
--
2.34.1
Powered by blists - more mailing lists