diff options
author | Denis V. Lunev <den@openvz.org> | 2007-11-11 01:12:03 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2007-11-11 01:12:03 -0500 |
commit | 2994c63863ac350c4c8c6a65d8110749c2abb95c (patch) | |
tree | 5509f71222641098683df1b1e0ff7bdfc2758b2c /net/core/fib_rules.c | |
parent | 33d36bb83c5b566c98a441e791736e25dbc35fc3 (diff) |
[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>
Diffstat (limited to 'net/core/fib_rules.c')
-rw-r--r-- | net/core/fib_rules.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/net/core/fib_rules.c b/net/core/fib_rules.c index 13de6f53f09..848132b6cb7 100644 --- a/net/core/fib_rules.c +++ b/net/core/fib_rules.c | |||
@@ -18,6 +18,28 @@ | |||
18 | static LIST_HEAD(rules_ops); | 18 | static LIST_HEAD(rules_ops); |
19 | static DEFINE_SPINLOCK(rules_mod_lock); | 19 | static DEFINE_SPINLOCK(rules_mod_lock); |
20 | 20 | ||
21 | int fib_default_rule_add(struct fib_rules_ops *ops, | ||
22 | u32 pref, u32 table, u32 flags) | ||
23 | { | ||
24 | struct fib_rule *r; | ||
25 | |||
26 | r = kzalloc(ops->rule_size, GFP_KERNEL); | ||
27 | if (r == NULL) | ||
28 | return -ENOMEM; | ||
29 | |||
30 | atomic_set(&r->refcnt, 1); | ||
31 | r->action = FR_ACT_TO_TBL; | ||
32 | r->pref = pref; | ||
33 | r->table = table; | ||
34 | r->flags = flags; | ||
35 | |||
36 | /* The lock is not required here, the list in unreacheable | ||
37 | * at the moment this function is called */ | ||
38 | list_add_tail(&r->list, &ops->rules_list); | ||
39 | return 0; | ||
40 | } | ||
41 | EXPORT_SYMBOL(fib_default_rule_add); | ||
42 | |||
21 | static void notify_rule_change(int event, struct fib_rule *rule, | 43 | static void notify_rule_change(int event, struct fib_rule *rule, |
22 | struct fib_rules_ops *ops, struct nlmsghdr *nlh, | 44 | struct fib_rules_ops *ops, struct nlmsghdr *nlh, |
23 | u32 pid); | 45 | u32 pid); |