浏览代码

USB: Fix unload oops and memory leak in yealink driver

This patch fixes a memory leak and a kernel oops when trying to unload
the driver, due to an unbalanced cleanup.
Thanks Ivar Jensen for spotting my mistake.

Signed-off-by: Henk Vergonet <henk.vergonet@gmail.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Henk Vergonet 18 年之前
父节点
当前提交
3e2aac366f
共有 1 个文件被更改,包括 6 次插入6 次删除
  1. 6 6
      drivers/usb/input/yealink.c

+ 6 - 6
drivers/usb/input/yealink.c

@@ -810,12 +810,9 @@ static int usb_cleanup(struct yealink_dev *yld, int err)
 	if (yld == NULL)
 	if (yld == NULL)
 		return err;
 		return err;
 
 
-        if (yld->urb_irq) {
-		usb_kill_urb(yld->urb_irq);
-		usb_free_urb(yld->urb_irq);
-	}
-        if (yld->urb_ctl)
-		usb_free_urb(yld->urb_ctl);
+	usb_kill_urb(yld->urb_irq);	/* parameter validation in core/urb */
+	usb_kill_urb(yld->urb_ctl);	/* parameter validation in core/urb */
+
         if (yld->idev) {
         if (yld->idev) {
 		if (err)
 		if (err)
 			input_free_device(yld->idev);
 			input_free_device(yld->idev);
@@ -831,6 +828,9 @@ static int usb_cleanup(struct yealink_dev *yld, int err)
 	if (yld->irq_data)
 	if (yld->irq_data)
 		usb_buffer_free(yld->udev, USB_PKT_LEN,
 		usb_buffer_free(yld->udev, USB_PKT_LEN,
 				yld->irq_data, yld->irq_dma);
 				yld->irq_data, yld->irq_dma);
+
+	usb_free_urb(yld->urb_irq);	/* parameter validation in core/urb */
+	usb_free_urb(yld->urb_ctl);	/* parameter validation in core/urb */
 	kfree(yld);
 	kfree(yld);
 	return err;
 	return err;
 }
 }