Re: [PATCH] USB: core: Check buffer length matches wLength for control transfers
From: Greg KH <hidden>
Date: 2021-05-27 11:47:03
On Wed, May 26, 2021 at 11:32:44AM -0400, Alan Stern wrote:
quoted hunk ↗ jump to hunk
A type of inconsistency that can show up in control URBs is when the setup packet's wLength value does not match the URB's transfer_buffer_length field. The two should always be equal; differences could lead to information leaks or undefined behavior for OUT transfers or overruns for IN transfers. This patch adds a test for such mismatches during URB submission. If the test fails, the submission is rejected with a -EBADR error code (which is not used elsewhere in the USB core), and a debugging message is logged for people interested in tracking down these errors. Signed-off-by: Alan Stern <stern@rowland.harvard.edu> CC: Johan Hovold <johan@kernel.org> --- [as1961] Documentation/driver-api/usb/error-codes.rst | 3 +++ drivers/usb/core/urb.c | 6 ++++++ 2 files changed, 9 insertions(+) Index: usb-devel/drivers/usb/core/urb.c ===================================================================--- usb-devel.orig/drivers/usb/core/urb.c +++ usb-devel/drivers/usb/core/urb.c@@ -410,6 +410,12 @@ int usb_submit_urb(struct urb *urb, gfp_ dev_WARN_ONCE(&dev->dev, (usb_pipeout(urb->pipe) != is_out), "BOGUS control dir, pipe %x doesn't match bRequestType %x\n", urb->pipe, setup->bRequestType); + if (le16_to_cpu(setup->wLength) != urb->transfer_buffer_length) { + dev_dbg(&dev->dev, "BOGUS control len %d doesn't match transfer length %d\n", + le16_to_cpu(setup->wLength), + urb->transfer_buffer_length); + return -EBADR; + }
Looks good, let's see if this catches anything :) now queued up, thanks. greg k-h