USB: iowarrior: fix missing endpoint sanity checks
Subsystems (2)
cover USB: iowarrior: fix missing endpoint sanity checks
These patches add the missing endpoint sanity checks to probe that are needed to prevent a couple of NULL-derefs which could be trigger by a malicious device.
Johan
Johan Hovold (2):
USB: iowarrior: fix NULL-deref at probe
USB: iowarrior: fix NULL-deref in write
drivers/usb/misc/iowarrior.c | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-)
Signature · 1 line
2.12.0
PATCH 1/2 USB: iowarrior: fix NULL-deref at probe
Make sure to check for the required interrupt-in endpoint to avoid dereferencing a NULL-pointer should a malicious device lack such an endpoint.
Note that a fairly recent change purported to fix this issue, but added an insufficient test on the number of endpoints only, a test which can now be removed.
descriptors")
--- drivers/usb/misc/iowarrior.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-)
drivers/usb/misc/iowarrior.c +7 -6
@@ -781,12 +781,6 @@ static int iowarrior_probe(struct usb_interface *interface, iface_desc = interface->cur_altsetting; dev->product_id =le16_to_cpu (udev->descriptor.idProduct); -if (iface_desc->desc.bNumEndpoints <1 ) { -dev_err (&interface->dev,"Invalid number of endpoints\n" ); - retval = -EINVAL ; - goto error; - } -/* set up the endpoint information */ for (i =0 ; i < iface_desc->desc.bNumEndpoints; ++i) { endpoint = &iface_desc->endpoint[i].desc;
@@ -797,6 +791,13 @@ static int iowarrior_probe(struct usb_interface *interface,/* this one will match for the IOWarrior56 only */ dev->int_out_endpoint = endpoint; } + +if (!dev->int_in_endpoint) { +dev_err (&interface->dev,"no interrupt-in endpoint found\n" ); + retval = -ENODEV ; + goto error; + } +/* we have to check the report_size often, so remember it in the endianness suitable for our machine */ dev->report_size =usb_endpoint_maxp (dev->int_in_endpoint); if ((dev->interface->cur_altsetting->desc.bInterfaceNumber == 0) &&
Signature · 1 line
2.12.0
PATCH 2/2 USB: iowarrior: fix NULL-deref in write
In reply to Johan HovoldMake sure to verify that we have the required interrupt-out endpoint for IOWarrior56 devices to avoid dereferencing a NULL-pointer in write should a malicious device lack such an endpoint.
--- drivers/usb/misc/iowarrior.c | 8 ++++++++ 1 file changed, 8 insertions(+)
drivers/usb/misc/iowarrior.c +8 -0
@@ -798,6 +798,14 @@ static int iowarrior_probe(struct usb_interface *interface, goto error; } +if (dev->product_id ==USB_DEVICE_ID_CODEMERCS_IOW56 ) { +if (!dev->int_out_endpoint) { +dev_err (&interface->dev,"no interrupt-out endpoint found\n" ); + retval = -ENODEV ; + goto error; + } + } +/* we have to check the report_size often, so remember it in the endianness suitable for our machine */ dev->report_size =usb_endpoint_maxp (dev->int_in_endpoint); if ((dev->interface->cur_altsetting->desc.bInterfaceNumber == 0) &&
Signature · 1 line
2.12.0