From 72cc182aa4325402fde08070f157ecf7580a2014 Mon Sep 17 00:00:00 2001 From: Russ Butler Date: Tue, 20 Mar 2018 14:48:16 -0500 Subject: [PATCH] Limit USB control transfer size Limit the size of control reads to the max packet size of endpoint zero. This fixes the handling of large transfers. --- usb/device/USBDevice/USBDevice.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/usb/device/USBDevice/USBDevice.cpp b/usb/device/USBDevice/USBDevice.cpp index da3617cedd..611f91b1e1 100644 --- a/usb/device/USBDevice/USBDevice.cpp +++ b/usb/device/USBDevice/USBDevice.cpp @@ -49,6 +49,8 @@ #endif #define MAX_PACKET_SIZE_EP0 64 +#define USB_MIN(a, b) ((a) > (b) ? (b) : (a)) + bool USBDevice::_request_get_descriptor() { @@ -224,7 +226,7 @@ bool USBDevice::_control_out() complete_request_xfer_done(true); } } else { - _phy->ep0_read(_transfer.ptr, _transfer.remaining); + _phy->ep0_read(_transfer.ptr, USB_MIN(_transfer.remaining, _max_packet_size_ep0)); } return true; @@ -800,7 +802,7 @@ void USBDevice::_control_setup_continue() } else { /* OUT stage */ _transfer.stage = DataOut; - _phy->ep0_read(_transfer.ptr, _transfer.remaining); + _phy->ep0_read(_transfer.ptr, USB_MIN(_transfer.remaining, _max_packet_size_ep0)); } } else { /* Status stage */