Fix locking problem, race conditions and resource leaks in em28xx, em28xx-dvb
PATCH 1/1 Fix locking problem, race conditions and resource leaks in em28xx, em28xx-dvb
Hi,
Here's the latest draft of my patch (against 3.0). Any feedback greatly appreciated.
Cheers,
Chris
drivers/media/video/em28xx/em28xx-core.c renamed from drivers/media/video/em28xx/em28xx-core.c.orig +9 -18
@@ -1160,10 +1160,9 @@static DEFINE_MUTEX (em28xx_devlist_mutex);/* -* em28xx_realease_resources() -* unregisters the v4l2,i2c and usb devices -* called when the device gets disconected or at module unload -*/ +* em28xx_remove_from_devlist() +* Removes the device from the list of active devices. +*/ void em28xx_remove_from_devlist (struct em28xx *dev) {mutex_lock (&em28xx_devlist_mutex);
@@ -1171,13 +1170,6 @@mutex_unlock (&em28xx_devlist_mutex); }; -void em28xx_add_into_devlist (struct em28xx *dev) -{ -mutex_lock (&em28xx_devlist_mutex); -list_add_tail (&dev->devlist, &em28xx_devlist); -mutex_unlock (&em28xx_devlist_mutex); -}; -/* * Extension interface */
@@ -1193,8 +1185,8 @@list_for_each_entry (dev, &em28xx_devlist, devlist) { ops->init (dev); } -printk (KERN_INFO "Em28xx: Initialized (%s) extension\n" , ops->name);mutex_unlock (&em28xx_devlist_mutex); +printk (KERN_INFO "Em28xx: Initialized (%s) extension\n" , ops->name);return 0 ; }EXPORT_SYMBOL (em28xx_register_extension);
@@ -1207,9 +1199,9 @@list_for_each_entry (dev, &em28xx_devlist, devlist) { ops->fini (dev); } -printk (KERN_INFO "Em28xx: Removed (%s) extension\n" , ops->name);list_del (&ops->next);mutex_unlock (&em28xx_devlist_mutex); +printk (KERN_INFO "Em28xx: Removed (%s) extension\n" , ops->name); }EXPORT_SYMBOL (em28xx_unregister_extension);
@@ -1218,11 +1210,10 @@struct em28xx_ops *ops =NULL ;mutex_lock (&em28xx_devlist_mutex); -if (!list_empty (&em28xx_extension_devlist)) { -list_for_each_entry (ops, &em28xx_extension_devlist, next) { -if (ops->init) - ops->init (dev); - } +list_add_tail (&dev->devlist, &em28xx_devlist); +list_for_each_entry (ops, &em28xx_extension_devlist, next) { +if (ops->init) + ops->init (dev); }mutex_unlock (&em28xx_devlist_mutex); }
drivers/media/video/em28xx/em28xx-cards.c renamed from drivers/media/video/em28xx/em28xx-cards.c.orig +33 -35
171 lines not on this page · raw message
drivers/media/video/em28xx/em28xx-dvb.c renamed from drivers/media/video/em28xx/em28xx-dvb.c.orig +0 -2
@@ -542,7 +542,6 @@ dev->dvb = dvb; dvb->fe[0 ] = dvb->fe[1 ] =NULL ; -mutex_lock (&dev->lock);em28xx_set_mode (dev,EM28XX_DIGITAL_MODE );/* init frontend */ switch (dev->model) {
@@ -711,7 +710,6 @@em28xx_info ("Successfully loaded em28xx-dvb\n" ); ret:em28xx_set_mode (dev,EM28XX_SUSPEND ); -mutex_unlock (&dev->lock);return result; out_free: