linux/net/ipv6
Andrey Vagin b223856640 ipv6: fix race between ipv6_del_addr and DAD timer
Consider the following scenario:

ipv6_del_addr(ifp)
  ipv6_ifa_notify(RTM_DELADDR, ifp)
    ip6_del_rt(ifp->rt)

after returning from the ipv6_ifa_notify and enabling BH-s
back, but *before* calling the addrconf_del_timer the 
ifp->timer fires and:

addrconf_dad_timer(ifp)
  addrconf_dad_completed(ifp)
    ipv6_ifa_notify(RTM_NEWADDR, ifp)
      ip6_ins_rt(ifp->rt)

then return back to the ipv6_del_addr and:

in6_ifa_put(ifp)
  inet6_ifa_finish_destroy(ifp)
    dst_release(&ifp->rt->u.dst)

After this we have an ifp->rt inserted into fib6 lists, but 
queued for gc, which in turn can result in oopses in the
fib6_run_gc. Maybe some other nasty things, but we caught 
only the oops in gc so far.

The solution is to disarm the ifp->timer before flushing the
rt from it.

Signed-off-by: Andrey Vagin <avagin@parallels.com>
Signed-off-by: Pavel Emelyanov <xemul@openvz.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
2008-07-08 15:13:31 -07:00
..
netfilter inet fragments: fix race between inet_frag_find and inet_frag_secret_rebuild 2008-06-27 20:06:08 -07:00
addrconf_core.c
addrconf.c ipv6: fix race between ipv6_del_addr and DAD timer 2008-07-08 15:13:31 -07:00
addrlabel.c
af_inet6.c ipv6 netns: init net is used to set bindv6only for new sock 2008-06-09 15:53:30 -07:00
ah6.c
anycast.c
datagram.c ipv6: Check the hop limit setting in ancillary data. 2008-06-12 09:19:08 +09:00
esp6.c
exthdrs_core.c
exthdrs.c
fib6_rules.c
icmp.c
inet6_connection_sock.c
inet6_hashtables.c
ip6_fib.c
ip6_flowlabel.c [IPV6] NETNS: Handle ancillary data in appropriate namespace. 2008-06-05 04:02:36 +09:00
ip6_input.c ipv6: Drop packets for loopback address from outside of the box. 2008-06-19 16:33:57 -07:00
ip6_output.c
ip6_tunnel.c
ip6mr.c bogus format in ip6mr 2008-06-04 08:06:02 -07:00
ipcomp6.c
ipv6_sockglue.c ipv6: Remove options header when setsockopt's optlen is 0 2008-06-19 16:29:39 -07:00
Kconfig
Makefile
mcast.c
mip6.c
ndisc.c ndisc: Add missing strategies for per-device retrans timer/reachable time settings. 2008-05-19 16:25:42 -07:00
netfilter.c
proc.c
protocol.c
raw.c ipv6: Fix duplicate initialization of rawv6_prot.destroy 2008-06-12 16:34:34 -07:00
reassembly.c inet fragments: fix race between inet_frag_find and inet_frag_secret_rebuild 2008-06-27 20:06:08 -07:00
route.c ipv6 route: Convert rt6_device_match() to use RT6_LOOKUP_F_xxx flags. 2008-06-27 20:14:54 -07:00
sit.c ipv6 sit: Avoid extra need for compat layer in PRL management. 2008-06-16 16:48:20 -07:00
syncookies.c inet{6}_request_sock: Init ->opt and ->pktopts in the constructor 2008-06-10 12:39:35 -07:00
sysctl_net_ipv6.c
tcp_ipv6.c tcp: /proc/net/tcp rto,ato values not scaled properly (v2) 2008-06-27 20:00:19 -07:00
tunnel6.c [IPV6] TUNNEL6: Fix incoming packet length check for inter-protocol tunnel. 2008-06-05 04:02:32 +09:00
udp_impl.h
udp.c [IPV6]: inet_sk(sk)->cork.opt leak 2008-06-05 04:02:38 +09:00
udplite.c
xfrm6_input.c
xfrm6_mode_beet.c
xfrm6_mode_ro.c
xfrm6_mode_transport.c
xfrm6_mode_tunnel.c
xfrm6_output.c
xfrm6_policy.c
xfrm6_state.c
xfrm6_tunnel.c