netdev
[Top] [All Lists]

[patch-kj] net/ipv4/fib_hash.c: check kmem_cache_create()

To: netdev@xxxxxxxxxxx
Subject: [patch-kj] net/ipv4/fib_hash.c: check kmem_cache_create()
From: maximilian attems <janitor@xxxxxxxxxxxxxx>
Date: Mon, 21 Jun 2004 19:18:32 +0200
Mail-followup-to: netdev@xxxxxxxxxxx
Sender: netdev-bounce@xxxxxxxxxxx
User-agent: Mutt/1.5.6+20040523i


From: Francois Romieu <romieu@xxxxxxxxxxxxx>

kmem_cache_create leak.

Note: fib_hash_init() can be called many times.

Signed-off-by: Maximilian Attems <janitor@xxxxxxxxxxxxxx>



---

 linux-2.6.7-max/net/ipv4/fib_hash.c |   19 ++++++++++++++-----
 1 files changed, 14 insertions(+), 5 deletions(-)

diff -puN net/ipv4/fib_hash.c~ipv4_fib_hash_check net/ipv4/fib_hash.c
--- linux-2.6.7/net/ipv4/fib_hash.c~ipv4_fib_hash_check 2004-06-18 
09:10:27.000000000 +0200
+++ linux-2.6.7-max/net/ipv4/fib_hash.c 2004-06-18 09:10:27.000000000 +0200
@@ -871,15 +871,18 @@ struct fib_table * __init fib_hash_init(
 {
        struct fib_table *tb;
 
-       if (fn_hash_kmem == NULL)
+       tb = kmalloc(sizeof(struct fib_table) + sizeof(struct fn_hash), 
GFP_KERNEL);
+       if (!tb)
+               goto err_out;
+
+       if (!fn_hash_kmem) {
                fn_hash_kmem = kmem_cache_create("ip_fib_hash",
                                                 sizeof(struct fib_node),
                                                 0, SLAB_HWCACHE_ALIGN,
                                                 NULL, NULL);
-
-       tb = kmalloc(sizeof(struct fib_table) + sizeof(struct fn_hash), 
GFP_KERNEL);
-       if (tb == NULL)
-               return NULL;
+               if (!fn_hash_kmem)
+                       goto err_free;
+       }
 
        tb->tb_id = id;
        tb->tb_lookup = fn_hash_lookup;
@@ -889,7 +892,13 @@ struct fib_table * __init fib_hash_init(
        tb->tb_select_default = fn_hash_select_default;
        tb->tb_dump = fn_hash_dump;
        memset(tb->tb_data, 0, sizeof(struct fn_hash));
+err_out:
        return tb;
+
+err_free:
+       kfree(tb);
+       tb = NULL;
+       goto err_out;
 }
 
 /* ------------------------------------------------------------------------ */

_

<Prev in Thread] Current Thread [Next in Thread>