USB: core: WARN if pipe direction != setup packet direction
authorAlan Stern <stern@rowland.harvard.edu>
Sat, 22 May 2021 02:16:23 +0000 (22:16 -0400)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 22 May 2021 08:37:25 +0000 (10:37 +0200)
When a control URB is submitted, the direction indicated by URB's pipe
member is supposed to match the direction indicated by the setup
packet's bRequestType member.  A mismatch could lead to trouble,
depending on which field the host controller drivers use for
determining the actual direction.

This shouldn't ever happen; it would represent a careless bug in a
kernel driver somewhere.  This patch adds a dev_WARN_ONCE to let
people know about the potential problem.

Suggested-by: "Geoffrey D. Bennett" <g@b4.vu>
Reviewed-by: Johan Hovold <johan@kernel.org>
Signed-off-by: Alan Stern <stern@rowland.harvard.edu>
Link: https://lore.kernel.org/r/20210522021623.GB1260282@rowland.harvard.edu
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/usb/core/urb.c

index 357b149..279b392 100644 (file)
@@ -407,6 +407,9 @@ int usb_submit_urb(struct urb *urb, gfp_t mem_flags)
                        return -ENOEXEC;
                is_out = !(setup->bRequestType & USB_DIR_IN) ||
                                !setup->wLength;
+               dev_WARN_ONCE(&dev->dev, (usb_pipeout(urb->pipe) != is_out),
+                               "BOGUS control dir, pipe %x doesn't match bRequestType %x\n",
+                               urb->pipe, setup->bRequestType);
        } else {
                is_out = usb_endpoint_dir_out(&ep->desc);
        }