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 <xemul@openvz.org> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
b1424ed910
commit
4aa2c466a7
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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,
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue