fib: Fix fib zone and its hash leak on namespace stop
Subsystems (3)
PATCH 1/1 fib: Fix fib zone and its hash leak on namespace stop
When we stop a namespace we flush the table and free one, but the added fn_zone-s (and their hashes if grown) are leaked. Need to free. Tries releases all its stuff in the flushing code.
Shame on us - this bug exists since the very first make-fib-per-net patches in 2.6.27 :(
Signed-off-by Pavel Emelyanov <[email protected]>
---
include/net/ip_fib.h +2 -0
@@ -158,6 +158,8 @@ extern int fib_table_flush(struct fib_table *table);extern void fib_table_select_default (struct fib_table *table,const struct flowi *flp,struct fib_result *res); +extern void fib_free_table (struct fib_table *tb); +#ifndef CONFIG_IP_MULTIPLE_TABLES
net/ipv4/fib_frontend.c +1 -1
@@ -1052,7 +1052,7 @@ static void ip_fib_net_exit(struct net *net)hlist_for_each_entry_safe (tb, node, tmp, head, tb_hlist) {hlist_del (node);fib_table_flush (tb); -kfree (tb); +fib_free_table (tb); } }kfree (net->ipv4.fib_table_hash);
net/ipv4/fib_hash.c +18 -0
@@ -716,6 +716,24 @@ int fib_table_flush(struct fib_table *tb)return found; } +void fib_free_table (struct fib_table *tb) +{ +struct fn_hash *table = (struct fn_hash *) tb->tb_data; +struct fn_zone *fz, *next; + + next = table->fn_zone_list; +while (next !=NULL ) { + fz = next; + next = fz->fz_next; + +if (fz->fz_hash != fz->fz_embedded_hash) +fz_hash_free (fz->fz_hash, fz->fz_divisor); + +kfree (fz); + } + +kfree (tb); +} static inline int fn_hash_dump_bucket(struct sk_buff *skb, struct netlink_callback *cb,
net/ipv4/fib_trie.c +5 -0
@@ -1797,6 +1797,11 @@ int fib_table_flush(struct fib_table *tb)return found; } +void fib_free_table (struct fib_table *tb) +{ +kfree (tb); +} +void fib_table_select_default (struct fib_table *tb,const struct flowi *flp,struct fib_result *res)
From: Pavel Emelyanov <[email protected]>
Date: Thu, 28 Oct 2010 16:00:43 +0400
Quoted 8 lines
When we stop a namespace we flush the table and free one, but the added fn_zone-s (and their hashes if grown) are leaked. Need to free. Tries releases all its stuff in the flushing code.
Shame on us - this bug exists since the very first make-fib-per-net patches in 2.6.27 :(
Signed-off-by Pavel Emelyanov <[email protected]>
Applied.