patch "USB: rio500: refuse more than one device at a time" added to usb-linus
Subsystems (2)
This is a note to let you know that I've just added the patch titled
USB: rio500: refuse more than one device at a time
to my usb git tree which can be found at
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/usb.git
in the usb-linus branch.
The patch will show up in the next release of the linux-next tree (usually sometime within the next 24 hours during the week.)
The patch will hopefully also be merged in Linus's tree for the next -rc kernel release.
If you have any questions about this process, please let me know.
From 3864d33943b4a76c6e64616280e98d2410b1190f Mon Sep 17 00:00:00 2001
From: Oliver Neukum <[email protected]>
Date: Thu, 9 May 2019 11:30:58 +0200
Subject: USB: rio500: refuse more than one device at a time
This driver is using a global variable. It cannot handle more than one device at a time. The issue has been existing since the dawn of the driver.
--- drivers/usb/misc/rio500.c | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-)
drivers/usb/misc/rio500.c +18 -6
@@ -447,15 +447,23 @@ static int probe_rio(struct usb_interface *intf, {struct usb_device *dev =interface_to_usbdev (intf);struct rio_usb_data *rio = &rio_instance; -int retval; +int retval =0 ; -dev_info (&intf->dev,"USB Rio found at address %d\n" , dev->devnum); +mutex_lock (&rio500_mutex); +if (rio->present) { +dev_info (&intf->dev,"Second USB Rio at address %d refused\n" , dev->devnum); + retval = -EBUSY ; + goto bail_out; + }else { +dev_info (&intf->dev,"USB Rio found at address %d\n" , dev->devnum); + } retval =usb_register_dev (intf, &usb_rio_class);if (retval) {dev_err (&dev->dev,"Not able to get a minor for this device.\n" ); -return -ENOMEM ; + retval = -ENOMEM ; + goto bail_out; } rio->rio_dev = dev;
@@ -464,7 +472,8 @@ static int probe_rio(struct usb_interface *intf,dev_err (&dev->dev,"probe_rio: Not enough memory for the output buffer\n" );usb_deregister_dev (intf, &usb_rio_class); -return -ENOMEM ; + retval = -ENOMEM ; + goto bail_out; }dev_dbg (&intf->dev,"obuf address:%p\n" , rio->obuf);
@@ -473,7 +482,8 @@ static int probe_rio(struct usb_interface *intf, "probe_rio: Not enough memory for the input buffer\n");usb_deregister_dev (intf, &usb_rio_class);kfree (rio->obuf); -return -ENOMEM ; + retval = -ENOMEM ; + goto bail_out; }dev_dbg (&intf->dev,"ibuf address:%p\n" , rio->ibuf);
@@ -481,8 +491,10 @@ static int probe_rio(struct usb_interface *intf,usb_set_intfdata (intf, rio); rio->present =1 ; +bail_out: +mutex_unlock (&rio500_mutex); -return 0 ; +return retval; }static void disconnect_rio (struct usb_interface *intf)
Signature · 1 line
2.21.0