[INET]: Small possible memory leak in FIB rules

This patch fixes a small memory leak. Default fib rules can be deleted by
the user if the rule does not carry FIB_RULE_PERMANENT flag, f.e. by
	ip rule flush

Such a rule will not be freed as the ref-counter has 2 on start and becomes
clearly unreachable after removal.

Signed-off-by: Denis V. Lunev <den@openvz.org>
Acked-by: Alexey Kuznetsov <kuznet@ms2.inr.ac.ru>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Denis V. Lunev
2007-11-10 22:12:03 -08:00
committed by David S. Miller
parent 33d36bb83c
commit 2994c63863
5 changed files with 62 additions and 64 deletions

View File

@@ -31,25 +31,6 @@ struct fib6_rule
static struct fib_rules_ops fib6_rules_ops;
static struct fib6_rule main_rule = {
.common = {
.refcnt = ATOMIC_INIT(2),
.pref = 0x7FFE,
.action = FR_ACT_TO_TBL,
.table = RT6_TABLE_MAIN,
},
};
static struct fib6_rule local_rule = {
.common = {
.refcnt = ATOMIC_INIT(2),
.pref = 0,
.action = FR_ACT_TO_TBL,
.table = RT6_TABLE_LOCAL,
.flags = FIB_RULE_PERMANENT,
},
};
struct dst_entry *fib6_rule_lookup(struct flowi *fl, int flags,
pol_lookup_t lookup)
{
@@ -270,11 +251,23 @@ static struct fib_rules_ops fib6_rules_ops = {
.owner = THIS_MODULE,
};
static int __init fib6_default_rules_init(void)
{
int err;
err = fib_default_rule_add(&fib6_rules_ops, 0,
RT6_TABLE_LOCAL, FIB_RULE_PERMANENT);
if (err < 0)
return err;
err = fib_default_rule_add(&fib6_rules_ops, 0x7FFE, RT6_TABLE_MAIN, 0);
if (err < 0)
return err;
return 0;
}
void __init fib6_rules_init(void)
{
list_add_tail(&local_rule.common.list, &fib6_rules_ops.rules_list);
list_add_tail(&main_rule.common.list, &fib6_rules_ops.rules_list);
BUG_ON(fib6_default_rules_init());
fib_rules_register(&fib6_rules_ops);
}