I've had different versions of this floating around for a while;
basically, the goal is to be more robust against devices that
misbehave by returning garbage descriptors in certain cases.
- Dave
Add an extra check when fetching descriptors: the type must be
correct. This guards against different types of firmware (or maybe
hardware) errors than the two checks already being made.
Signed-off-by: David Brownell <[EMAIL PROTECTED]>
--- 1.64/drivers/usb/core/message.c Wed Jun 30 06:48:12 2004
+++ edited/drivers/usb/core/message.c Wed Jul 14 12:05:11 2004
@@ -577,8 +577,13 @@
USB_REQ_GET_DESCRIPTOR, USB_DIR_IN,
(type << 8) + index, 0, buf, size,
HZ * USB_CTRL_GET_TIMEOUT);
- if (!(result == 0 || result == -EPIPE))
- break;
+ if (result == 0 || result == -EPIPE)
+ continue;
+ if (result > 1 && ((u8 *)buf)[1] != type) {
+ retval = -EPROTO;
+ continue;
+ }
+ break;
}
return result;
}