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;
}
/* ------------------------------------------------------------------------ */
_
|