Skip to content

Commit

Permalink
[DRIVER MODEL] Fix depca
Browse files Browse the repository at this point in the history
Release code in driver modules is a potential cause of oopsen.
The device may be in use by a userspace process, which will keep
a reference to the device.  If the module is unloaded, the module
text will be freed.  Subsequently, when the last reference is
dropped, the release code will be called, which no longer exists.

Use generic platform device allocation/release code in modules.

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Acked-by: Greg Kroah-Hartman <gregkh@suse.de>
  • Loading branch information
Russell King authored and Russell King committed Nov 5, 2005
1 parent 37c12e7 commit 5d994b7
Showing 1 changed file with 7 additions and 17 deletions.
24 changes: 7 additions & 17 deletions drivers/net/depca.c
Original file line number Diff line number Diff line change
Expand Up @@ -1470,15 +1470,6 @@ static int __init depca_mca_probe(struct device *device)
** ISA bus I/O device probe
*/

static void depca_platform_release (struct device *device)
{
struct platform_device *pldev;

/* free device */
pldev = to_platform_device (device);
kfree (pldev);
}

static void __init depca_platform_probe (void)
{
int i;
Expand All @@ -1491,19 +1482,16 @@ static void __init depca_platform_probe (void)
* line, use it (if valid) */
if (io && io != depca_io_ports[i].iobase)
continue;

if (!(pldev = kmalloc (sizeof (*pldev), GFP_KERNEL)))

pldev = platform_device_alloc(depca_string, i);
if (!pldev)
continue;

memset (pldev, 0, sizeof (*pldev));
pldev->name = depca_string;
pldev->id = i;
pldev->dev.platform_data = (void *) depca_io_ports[i].iobase;
pldev->dev.release = depca_platform_release;
depca_io_ports[i].device = pldev;

if (platform_device_register (pldev)) {
kfree (pldev);
if (platform_device_add(pldev)) {
platform_device_put(pldev);
depca_io_ports[i].device = NULL;
continue;
}
Expand All @@ -1515,6 +1503,7 @@ static void __init depca_platform_probe (void)
* allocated structure */

depca_io_ports[i].device = NULL;
pldev->dev.platform_data = NULL;
platform_device_unregister (pldev);
}
}
Expand Down Expand Up @@ -2112,6 +2101,7 @@ static void __exit depca_module_exit (void)

for (i = 0; depca_io_ports[i].iobase; i++) {
if (depca_io_ports[i].device) {
depca_io_ports[i].device->dev.platform_data = NULL;
platform_device_unregister (depca_io_ports[i].device);
depca_io_ports[i].device = NULL;
}
Expand Down

0 comments on commit 5d994b7

Please sign in to comment.