]> git.neil.brown.name Git - history.git/commitdiff
[PATCH] Memory leak in drivers_net_arlan.c (1)
authorRusty Russell <rusty@rustcorp.com.au>
Sun, 9 Feb 2003 10:59:23 +0000 (02:59 -0800)
committerLinus Torvalds <torvalds@home.transmeta.com>
Sun, 9 Feb 2003 10:59:23 +0000 (02:59 -0800)
From:  Pablo Menichini <pablo@menichini.com.ar>

drivers/net/arlan.c
drivers/net/arlan.h

index 204e6518bde9466601912d90add9351024815fd5..8911e8b3af71e8e98bac48a99dbc5cd2e0c713ef 100644 (file)
@@ -1188,34 +1188,31 @@ static int __init
 {
 
        struct net_device *dev;
+       struct arlan_private *ap;
 
        ARLAN_DEBUG_ENTRY("arlan_allocate_device");
 
-       if (!devs)
-               dev = init_etherdev(0, sizeof(struct arlan_private));
-       else
-       {
+       if (!devs) {
+               dev = init_etherdev(0, sizeof(struct arlan_private) + sizeof(struct arlan_shmem));
+               if (!dev) {
+                       printk(KERN_ERR "ARLAN: init_etherdev failed\n");
+                       return 0;
+               }
+               ap = dev->priv;
+               ap->config = dev->priv + sizeof(struct arlan_private);
+               ap->init_etherdev_alloc = 1;
+       } else {
                dev = devs;
-               dev->priv = kmalloc(sizeof(struct arlan_private), GFP_KERNEL);
-       };
-
-       if (dev == NULL || dev->priv == NULL)
-       {
-               printk(KERN_CRIT "init_etherdev failed ");
-               return 0;
+               dev->priv = kmalloc(sizeof(struct arlan_private) + sizeof(struct arlan_shmem), GFP_KERNEL);
+               if (!dev->priv) {
+                       printk(KERN_ERR "ARLAN: kmalloc of dev->priv failed\n");
+                       return 0;
+               }
+               ap = dev->priv;
+               ap->config = dev->priv + sizeof(struct arlan_private);
+               memset(ap, 0, sizeof(*ap));
        }
 
-       memset(dev->priv,0,sizeof(struct arlan_private));
-
-       ((struct arlan_private *) dev->priv)->conf =
-           kmalloc(sizeof(struct arlan_shmem), GFP_KERNEL);
-
-       if (dev == NULL || dev->priv == NULL ||
-           ((struct arlan_private *) dev->priv)->conf == NULL)
-       {
-               return 0;
-               printk(KERN_CRIT " No memory at arlan_allocate_device \n");
-       }
        /* Fill in the 'dev' fields. */
        dev->base_addr = 0;
        dev->mem_start = 0;
@@ -2056,6 +2053,7 @@ int init_module(void)
 void cleanup_module(void)
 {
        int i = 0;
+       struct arlan_private ap;
 
        ARLAN_DEBUG_ENTRY("cleanup_module");
 
@@ -2069,13 +2067,14 @@ void cleanup_module(void)
 
 //                     release_mem_region(virt_to_phys(arlan_device[i]->mem_start), 0x2000 );
                        unregister_netdev(arlan_device[i]);
-                       if (arlan_device[i]->priv)
-                       {
-                               if (((struct arlan_private *) arlan_device[i]->priv)->conf)
-                                       kfree(((struct arlan_private *) arlan_device[i]->priv)->conf);
+                       ap = arlan_device[i]->priv;
+                       if (ap->init_etherdev_alloc) {
                                kfree(arlan_device[i]);
+                               arlan_device[i] = NULL;
+                       } else {
+                               kfree(ap);
+                               ap = NULL;
                        }
-                       arlan_device[i] = NULL;
                }
        }
        ARLAN_DEBUG_EXIT("cleanup_module");
index f0c19eacc9fc7602d9e57d7f43c039e470a1faa4..198583664a35dba2f0b542e8b5b398e1b052258e 100644 (file)
@@ -410,6 +410,7 @@ struct arlan_private {
       int      out_time10;
       int      in_bytes10;
       int      out_bytes10;
+      int      init_etherdev_alloc;
 };