Pārlūkot izejas kodu

USB: fix read vs. disconnect race in cytherm driver

the disconnect method of this driver set intfdata to NULL before
removing attribute files. The attributes' read methods will happily
follow the NULL pointer. Here's the correct ordering.

Signed-off-by : Oliver Neukum <oneukum@suse.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Oliver Neukum 18 gadi atpakaļ
vecāks
revīzija
d718d2b178
1 mainītis faili ar 3 papildinājumiem un 1 dzēšanām
  1. 3 1
      drivers/usb/misc/cytherm.c

+ 3 - 1
drivers/usb/misc/cytherm.c

@@ -399,7 +399,6 @@ static void cytherm_disconnect(struct usb_interface *interface)
 	struct usb_cytherm *dev;
 	struct usb_cytherm *dev;
 
 
 	dev = usb_get_intfdata (interface);
 	dev = usb_get_intfdata (interface);
-	usb_set_intfdata (interface, NULL);
 
 
 	device_remove_file(&interface->dev, &dev_attr_brightness);
 	device_remove_file(&interface->dev, &dev_attr_brightness);
 	device_remove_file(&interface->dev, &dev_attr_temp);
 	device_remove_file(&interface->dev, &dev_attr_temp);
@@ -407,6 +406,9 @@ static void cytherm_disconnect(struct usb_interface *interface)
 	device_remove_file(&interface->dev, &dev_attr_port0);
 	device_remove_file(&interface->dev, &dev_attr_port0);
 	device_remove_file(&interface->dev, &dev_attr_port1);
 	device_remove_file(&interface->dev, &dev_attr_port1);
 
 
+	/* first remove the files, then NULL the pointer */
+	usb_set_intfdata (interface, NULL);
+
 	usb_put_dev(dev->udev);
 	usb_put_dev(dev->udev);
 
 
 	kfree(dev);
 	kfree(dev);