]> git.baikalelectronics.ru Git - kernel.git/commit
ipv6: prevent possible fib6 leaks
authorEric Dumazet <edumazet@google.com>
Thu, 16 May 2019 02:39:52 +0000 (19:39 -0700)
committerDavid S. Miller <davem@davemloft.net>
Thu, 16 May 2019 19:21:00 +0000 (12:21 -0700)
commitda91e9f579516d4b4ac6ff4760ae7cae27d885b0
tree6b09b1806f97585a5259d909d0bfa47c93472d52
parentd0881d1a8ee209e30c1e350a64c4f8a04563e74a
ipv6: prevent possible fib6 leaks

At ipv6 route dismantle, fib6_drop_pcpu_from() is responsible
for finding all percpu routes and set their ->from pointer
to NULL, so that fib6_ref can reach its expected value (1).

The problem right now is that other cpus can still catch the
route being deleted, since there is no rcu grace period
between the route deletion and call to fib6_drop_pcpu_from()

This can leak the fib6 and associated resources, since no
notifier will take care of removing the last reference(s).

I decided to add another boolean (fib6_destroying) instead
of reusing/renaming exception_bucket_flushed to ease stable backports,
and properly document the memory barriers used to implement this fix.

This patch has been co-developped with Wei Wang.

Fixes: 87bd20a7a731 ("net/ipv6: separate handling of FIB entries from dst based routes")
Signed-off-by: Eric Dumazet <edumazet@google.com>
Reported-by: syzbot <syzkaller@googlegroups.com>
Cc: Wei Wang <weiwan@google.com>
Cc: David Ahern <dsahern@gmail.com>
Cc: Martin Lau <kafai@fb.com>
Acked-by: Wei Wang <weiwan@google.com>
Acked-by: Martin KaFai Lau <kafai@fb.com>
Reviewed-by: David Ahern <dsahern@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/net/ip6_fib.h
net/ipv6/ip6_fib.c
net/ipv6/route.c