Re: [RFC PATCH] USB: check sg buffer size in usb_submit_urb

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hello.

On 25-06-2013 17:17, Ming Lei wrote:

USB spec stats that short packet can only appear at the end
of transfer. Because lost of HC(EHCI/UHCI/OHCI/...) can't
build a full packet from discontinuous buffers, we introduce
the limit in usb_submit_urb() to avoid such kind of bad sg
coming from driver.

The limit might be a bit strict:
	- platform has iommu to do sg list mapping
	- some host controllers may support to build full packet from
	discontinuous buffers.

But considered that most of HCs don't support that, and driver
need work well or keep consistent on different HCs or ARCHs, we
have to introduce the limit.

Currently, only usbtest is reported to pass such sg buffers to HC,
and other users(mass storage, usbfs) don't have the problem.

Reported-by: Konstantin Filatov <kfilatov@xxxxxxxxxxxxx>
Reported-by: Denis V. Lunev <den@xxxxxxxxxx>
Cc: Alan Stern <stern@xxxxxxxxxxxxxxxxxxx>
Cc: Felipe Balbi <balbi@xxxxxx>
Signed-off-by: Ming Lei <ming.lei@xxxxxxxxxxxxx>
---
  drivers/usb/core/urb.c |   11 +++++++++++
  include/linux/usb.h    |    3 ++-
  2 files changed, 13 insertions(+), 1 deletion(-)

diff --git a/drivers/usb/core/urb.c b/drivers/usb/core/urb.c
index 16927fa..ad6717a 100644
--- a/drivers/usb/core/urb.c
+++ b/drivers/usb/core/urb.c
[...]
@@ -413,6 +414,16 @@ int usb_submit_urb(struct urb *urb, gfp_t mem_flags)
  			urb->iso_frame_desc[n].status = -EXDEV;
  			urb->iso_frame_desc[n].actual_length = 0;
  		}
+	} else {
+		/* check sg buffer size */
+		if (urb->num_sgs) {

   Why not *else if*? Would save you one level of indentation.

+			struct scatterlist *sg;
+			int i;
+
+			for_each_sg(urb->sg, sg, urb->num_sgs, i)
+				if (i < urb->num_sgs - 1 && (sg->length % max))

   Don't need () around %.

+					return -EINVAL;
+		}
  	}

  	/* the I/O buffer must be mapped/unmapped, except when length=0 */

WBR, Sergei

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux