ipmr: dont corrupt lists
ipmr_rules_exit() and ip6mr_rules_exit() free a list of items, but forget to properly remove these items from list. List head is not changed and still points to freed memory. This can trigger a fault later when icmpv6_sk_exit() is called. Fix is to either reinit list, or use list_del() to properly remove items from list before freeing them. bugzilla report : https://bugzilla.kernel.org/show_bug.cgi?id=16120 Introduced by commitd1db275dd3
(ipv6: ip6mr: support multiple tables) and commitf0ad0860d0
(ipv4: ipmr: support multiple tables) Reported-by: Alex Zhavnerchik <alex.vizor@gmail.com> Signed-off-by: Eric Dumazet <eric.dumazet@gmail.com> CC: Patrick McHardy <kaber@trash.net> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
3fd7fa4a89
commit
035320d547
2 changed files with 6 additions and 2 deletions
|
@ -267,8 +267,10 @@ static void __net_exit ipmr_rules_exit(struct net *net)
|
|||
{
|
||||
struct mr_table *mrt, *next;
|
||||
|
||||
list_for_each_entry_safe(mrt, next, &net->ipv4.mr_tables, list)
|
||||
list_for_each_entry_safe(mrt, next, &net->ipv4.mr_tables, list) {
|
||||
list_del(&mrt->list);
|
||||
kfree(mrt);
|
||||
}
|
||||
fib_rules_unregister(net->ipv4.mr_rules_ops);
|
||||
}
|
||||
#else
|
||||
|
|
|
@ -254,8 +254,10 @@ static void __net_exit ip6mr_rules_exit(struct net *net)
|
|||
{
|
||||
struct mr6_table *mrt, *next;
|
||||
|
||||
list_for_each_entry_safe(mrt, next, &net->ipv6.mr6_tables, list)
|
||||
list_for_each_entry_safe(mrt, next, &net->ipv6.mr6_tables, list) {
|
||||
list_del(&mrt->list);
|
||||
ip6mr_free_table(mrt);
|
||||
}
|
||||
fib_rules_unregister(net->ipv6.mr6_rules_ops);
|
||||
}
|
||||
#else
|
||||
|
|
Loading…
Reference in a new issue