patch "USB: iowarrior: fix use-after-free after driver unbind" added to usb-linus
Subsystems (2)
This is a note to let you know that I've just added the patch titled
USB: iowarrior: fix use-after-free after driver unbind
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 b5f8d46867ca233d773408ffbe691a8062ed718f Mon Sep 17 00:00:00 2001
From: Johan Hovold <[email protected]>
Date: Wed, 9 Oct 2019 12:48:43 +0200
Subject: USB: iowarrior: fix use-after-free after driver unbind
Make sure to stop also the asynchronous write URBs on disconnect() to avoid use-after-free in the completion handler after driver unbind.
--- drivers/usb/misc/iowarrior.c | 6 ++++++ 1 file changed, 6 insertions(+)
drivers/usb/misc/iowarrior.c +6 -0
@@ -87,6 +87,7 @@ struct iowarrior {char chip_serial[9 ];/* the serial number string of the chip connected */ int report_size;/* number of bytes in a report */ u16 product_id; +struct usb_anchor submitted; };/*--------------*/
@@ -425,11 +426,13 @@ static ssize_t iowarrior_write(struct file *file, retval = -EFAULT ; goto error; } +usb_anchor_urb (int_out_urb, &dev->submitted); retval =usb_submit_urb (int_out_urb,GFP_KERNEL );if (retval) {dev_dbg (&dev->interface->dev,"submit error %d for urb nr.%d\n" , retval,atomic_read (&dev->write_busy)); +usb_unanchor_urb (int_out_urb); goto error; }/* submit was ok */
@@ -770,6 +773,8 @@ static int iowarrior_probe(struct usb_interface *interface, iface_desc = interface->cur_altsetting; dev->product_id =le16_to_cpu (udev->descriptor.idProduct); +init_usb_anchor (&dev->submitted); + res =usb_find_last_int_in_endpoint (iface_desc, &dev->int_in_endpoint);if (res) {dev_err (&interface->dev,"no interrupt-in endpoint found\n" );
@@ -885,6 +890,7 @@ static void iowarrior_disconnect(struct usb_interface *interface)Deleting the device is postponed until close() was called. */ usb_kill_urb (dev->int_in_urb); +usb_kill_anchored_urbs (&dev->submitted);wake_up_interruptible (&dev->read_wait);wake_up_interruptible (&dev->write_wait);mutex_unlock (&dev->mutex);
Signature · 1 line
2.23.0