PERFORCE change 155932 for review

Hans Petter Selasky hselasky at FreeBSD.org
Sat Jan 10 11:44:02 PST 2009


http://perforce.freebsd.org/chv.cgi?CH=155932

Change 155932 by hselasky at hselasky_laptop001 on 2009/01/10 19:43:54

	
	Refactor "usb2_desc_foreach()" to not use "USB_ADD_BYTES" macro.
	Requested by Dag-Erling Smørgrav.
	
	More functions will be refactored to not use the "USB_ADD_BYTES"
	macro when I find time.

Affected files ...

.. //depot/projects/usb/src/sys/dev/usb2/core/usb2_parse.c#6 edit

Differences ...

==== //depot/projects/usb/src/sys/dev/usb2/core/usb2_parse.c#6 (text+ko) ====

@@ -43,25 +43,44 @@
  *   Else: Next descriptor after "desc"
  *------------------------------------------------------------------------*/
 struct usb2_descriptor *
-usb2_desc_foreach(struct usb2_config_descriptor *cd, struct usb2_descriptor *desc)
+usb2_desc_foreach(struct usb2_config_descriptor *cd, 
+    struct usb2_descriptor *_desc)
 {
-	void *end;
+	uint8_t *desc_next;
+	uint8_t *start;
+	uint8_t *end;
+	uint8_t *desc;
 
-	if (cd == NULL) {
+	/* be NULL safe */
+	if (cd == NULL)
 		return (NULL);
-	}
-	end = USB_ADD_BYTES(cd, UGETW(cd->wTotalLength));
+
+	/* We assume that the "wTotalLength" has been checked. */
+	start = (uint8_t *)cd;
+	end = start + UGETW(cd->wTotalLength);
+	desc = (uint8_t *)_desc;
+
+	/* Get start of next USB descriptor. */
+	if (desc == NULL)
+		desc = start;
+	else
+		desc = desc + desc[0];
+
+	/* Check that the next USB descriptor is within the range. */
+	if ((desc < start) || (desc >= end))
+		return (NULL);		/* out of range, or EOD */
+
+	/* Check that the second next USB descriptor is within range. */
+	desc_next = desc + desc[0];
+	if ((desc_next < start) || (desc_next > end))
+		return (NULL);		/* out of range */
+
+	/* Check minimum descriptor length. */
+	if (desc[0] < 3)
+		return (NULL);		/* too short descriptor */
 
-	if (desc == NULL) {
-		desc = USB_ADD_BYTES(cd, 0);
-	} else {
-		desc = USB_ADD_BYTES(desc, desc->bLength);
-	}
-	return (((((void *)desc) >= ((void *)cd)) &&
-	    (((void *)desc) < end) &&
-	    (USB_ADD_BYTES(desc, desc->bLength) >= ((void *)cd)) &&
-	    (USB_ADD_BYTES(desc, desc->bLength) <= end) &&
-	    (desc->bLength >= sizeof(*desc))) ? desc : NULL);
+	/* Return start of next descriptor. */
+	return ((struct usb2_descriptor *)desc);
 }
 
 /*------------------------------------------------------------------------*
@@ -140,7 +159,6 @@
 	desc = ((void *)d);
 
 	while ((desc = usb2_desc_foreach(cd, desc))) {
-
 		if (desc->bDescriptorType == UDESC_INTERFACE) {
 			break;
 		}
@@ -195,7 +213,6 @@
 	uint16_t n = 0;
 
 	while ((desc = usb2_desc_foreach(cd, desc))) {
-
 		if ((desc->bDescriptorType == UDESC_INTERFACE) &&
 		    (desc->bLength >= sizeof(*id))) {
 			id = (void *)desc;


More information about the p4-projects mailing list