On Tue, 8 Mar 2005, David Brownell wrote:
> > Why not instead handle the control transfer case directly at
> > the spot where is_in is defined (there's a perfect opportunity a few lines
> > down) and then use it consistently?
>
> I'm not sure what you're saying there. "Where it's defined" is not
> the same as "a few lines down". And almost by definition, a single
> use is consistent (with itself) ...
>
>
> > Also you could make things slightly
> > simpler if is_in stored the direction mask rather than a boolean flag.
>
> If GCC is optimizing out its single use, it shouldn't matter ... ;)
I should have been more concrete. And I didn't notice that dr doesn't get
filled in until later.
How about something like the patch below?
Alan Stern
Signed-off-by: Alan Stern <[EMAIL PROTECTED]>
===== drivers/usb/core/devio.c 1.150 vs edited =====
--- 1.150/drivers/usb/core/devio.c 2005-03-02 11:39:56 -05:00
+++ edited/drivers/usb/core/devio.c 2005-03-08 13:30:39 -05:00
@@ -823,7 +823,7 @@
struct async *as;
struct usb_ctrlrequest *dr = NULL;
unsigned int u, totlen, isofrmlen;
- int ret, interval = 0, ifnum = -1;
+ int ret, interval = 0, ifnum = -1, is_in;
if (uurb->flags & ~(USBDEVFS_URB_ISO_ASAP|USBDEVFS_URB_SHORT_NOT_OK|
URB_NO_FSBR|URB_ZERO_PACKET))
@@ -832,13 +832,17 @@
return -EINVAL;
if (uurb->signr != 0 && (uurb->signr < SIGRTMIN || uurb->signr >
SIGRTMAX))
return -EINVAL;
- if (!(uurb->type == USBDEVFS_URB_TYPE_CONTROL && (uurb->endpoint &
~USB_ENDPOINT_DIR_MASK) == 0)) {
+ if (uurb->endpoint & ~(USB_ENDPOINT_DIR_MASK|USB_ENDPOINT_NUMBER_MASK))
+ return -EINVAL;
+ is_in = uurb->endpoint & USB_ENDPOINT_DIR_MASK;
+ if (uurb->type != USBDEVFS_URB_TYPE_CONTROL) {
if ((ifnum = findintfep(ps->dev, uurb->endpoint)) < 0)
return ifnum;
if ((ret = checkintf(ps, ifnum)))
return ret;
- }
- if ((uurb->endpoint & USB_ENDPOINT_DIR_MASK) != 0)
+ } else if ((uurb->endpoint & USB_ENDPOINT_NUMBER_MASK) != 0)
+ return -EINVAL;
+ if (is_in)
ep = ps->dev->ep_in [uurb->endpoint & USB_ENDPOINT_NUMBER_MASK];
else
ep = ps->dev->ep_out [uurb->endpoint &
USB_ENDPOINT_NUMBER_MASK];
@@ -866,11 +870,12 @@
kfree(dr);
return ret;
}
- uurb->endpoint = (uurb->endpoint & ~USB_ENDPOINT_DIR_MASK) |
(dr->bRequestType & USB_ENDPOINT_DIR_MASK);
+ is_in = uurb->endpoint = dr->bRequestType &
USB_ENDPOINT_DIR_MASK;
+ /* Warn if the direction changed? */
uurb->number_of_packets = 0;
uurb->buffer_length = le16_to_cpup(&dr->wLength);
uurb->buffer += 8;
- if (!access_ok((uurb->endpoint & USB_DIR_IN) ? VERIFY_WRITE :
VERIFY_READ, uurb->buffer, uurb->buffer_length)) {
+ if (!access_ok(is_in ? VERIFY_WRITE : VERIFY_READ,
uurb->buffer, uurb->buffer_length)) {
kfree(dr);
return -EFAULT;
}
@@ -886,7 +891,7 @@
uurb->number_of_packets = 0;
if (uurb->buffer_length > MAX_USBFS_BUFFER_SIZE)
return -EINVAL;
- if (!access_ok((uurb->endpoint & USB_DIR_IN) ? VERIFY_WRITE :
VERIFY_READ, uurb->buffer, uurb->buffer_length))
+ if (!access_ok(is_in ? VERIFY_WRITE : VERIFY_READ,
uurb->buffer, uurb->buffer_length))
return -EFAULT;
break;
@@ -930,7 +935,7 @@
interval = ep->desc.bInterval;
if (uurb->buffer_length > MAX_USBFS_BUFFER_SIZE)
return -EINVAL;
- if (!access_ok((uurb->endpoint & USB_DIR_IN) ? VERIFY_WRITE :
VERIFY_READ, uurb->buffer, uurb->buffer_length))
+ if (!access_ok(is_in ? VERIFY_WRITE : VERIFY_READ,
uurb->buffer, uurb->buffer_length))
return -EFAULT;
break;
@@ -971,14 +976,14 @@
kfree(isopkt);
as->ps = ps;
as->userurb = arg;
- if (uurb->endpoint & USB_DIR_IN)
+ if (is_in)
as->userbuffer = uurb->buffer;
else
as->userbuffer = NULL;
as->signr = uurb->signr;
as->ifnum = ifnum;
as->task = current;
- if (!(uurb->endpoint & USB_DIR_IN)) {
+ if (!is_in) {
if (copy_from_user(as->urb->transfer_buffer, uurb->buffer,
as->urb->transfer_buffer_length)) {
free_async(as);
return -EFAULT;
-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now.
http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click
_______________________________________________
[email protected]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel