summaryrefslogtreecommitdiffstats
path: root/drivers/usb/gadget/composite.c
diff options
context:
space:
mode:
authorFelipe Balbi2016-04-22 13:53:47 +0200
committerFelipe Balbi2016-04-28 08:02:00 +0200
commit0878263b68df372e6389b050fc2bd4f6d5b9f332 (patch)
treef57265071ca2d3db34d6eff077b2fe3708660044 /drivers/usb/gadget/composite.c
parentusb: dwc3: pci: pass the platform device as a parameter to dwc3_pci_quirks() (diff)
downloadkernel-qcow2-linux-0878263b68df372e6389b050fc2bd4f6d5b9f332.tar.gz
kernel-qcow2-linux-0878263b68df372e6389b050fc2bd4f6d5b9f332.tar.xz
kernel-qcow2-linux-0878263b68df372e6389b050fc2bd4f6d5b9f332.zip
usb: gadget: composite: avoid kernel oops with bad gadgets
If a gadget driver loaded to a Superspeed-capable peripheral controller, using a Superspeed cable, doesn't provide Superspeed descriptors, we will get a NULL pointer dereference. In order to avoid that situation, we will try to find any valid descriptors we can. If no set of descriptors is passed in, then we'll let that gadget oops anyhow. Signed-off-by: Felipe Balbi <felipe.balbi@linux.intel.com>
Diffstat (limited to 'drivers/usb/gadget/composite.c')
-rw-r--r--drivers/usb/gadget/composite.c22
1 files changed, 19 insertions, 3 deletions
diff --git a/drivers/usb/gadget/composite.c b/drivers/usb/gadget/composite.c
index de9ffd60fcfa..3d3cdc5ed20d 100644
--- a/drivers/usb/gadget/composite.c
+++ b/drivers/usb/gadget/composite.c
@@ -66,20 +66,36 @@ function_descriptors(struct usb_function *f,
{
struct usb_descriptor_header **descriptors;
+ /*
+ * NOTE: we try to help gadget drivers which might not be setting
+ * max_speed appropriately.
+ */
+
switch (speed) {
case USB_SPEED_SUPER_PLUS:
descriptors = f->ssp_descriptors;
- break;
+ if (descriptors)
+ break;
+ /* FALLTHROUGH */
case USB_SPEED_SUPER:
descriptors = f->ss_descriptors;
- break;
+ if (descriptors)
+ break;
+ /* FALLTHROUGH */
case USB_SPEED_HIGH:
descriptors = f->hs_descriptors;
- break;
+ if (descriptors)
+ break;
+ /* FALLTHROUGH */
default:
descriptors = f->fs_descriptors;
}
+ /*
+ * if we can't find any descriptors at all, then this gadget deserves to
+ * Oops with a NULL pointer dereference
+ */
+
return descriptors;
}