]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] M68k HP Lance Ethernet: Fix leaks on probe/removal
authorAndrew Morton <akpm@osdl.org>
Wed, 24 Nov 2004 09:58:29 +0000 (04:58 -0500)
committerJeff Garzik <jgarzik@pobox.com>
Wed, 24 Nov 2004 09:58:29 +0000 (04:58 -0500)
From: Geert Uytterhoeven <geert@linux-m68k.org>

HP Lance Ethernet: There's tons of leaks in the hplcance probing code, and it
doesn't release the memory region on removal either (from Christoph Hellwig)

Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Jeff Garzik <jgarzik@pobox.com>
drivers/net/hplance.c

index c79f5f2dde31f95a6280af6c8b1921390b00aa44..08703d6f934c7926e8ed1c53a9c45b3ec1a5dd47 100644 (file)
@@ -76,25 +76,31 @@ static int __devinit hplance_init_one(struct dio_dev *d,
                                const struct dio_device_id *ent)
 {
        struct net_device *dev;
-       int err;
+       int err = -ENOMEM;
 
        dev = alloc_etherdev(sizeof(struct hplance_private));
        if (!dev)
-               return -ENOMEM;
+               goto out;
 
-       if (!request_mem_region(d->resource.start, d->resource.end-d->resource.start, d->name))
-               return -EBUSY;
+       err = -EBUSY;
+       if (!request_mem_region(dio_resource_start(d),
+                               dio_resource_len(d), d->name))
+               goto out_free_netdev;
 
-       SET_MODULE_OWNER(dev);
-        
        hplance_init(dev, d);
        err = register_netdev(dev);
-       if (err) {
-               free_netdev(dev);
-               return err;
-       }
+       if (err)
+               goto out_release_mem_region;
+
        dio_set_drvdata(d, dev);
        return 0;
+
+ out_release_mem_region:
+       release_mem_region(dio_resource_start(d), dio_resource_len(d));
+ out_free_netdev:
+       free_netdev(dev);
+ out:
+       return err;
 }
 
 static void __devexit hplance_remove_one(struct dio_dev *d)
@@ -102,6 +108,7 @@ static void __devexit hplance_remove_one(struct dio_dev *d)
        struct net_device *dev = dio_get_drvdata(d);
 
        unregister_netdev(dev);
+       release_mem_region(dio_resource_start(d), dio_resource_len(d));
        free_netdev(dev);
 }