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