From f734ebe1cb0a1ecb6642ac8b1e941cfc2f9216b3 Mon Sep 17 00:00:00 2001 From: "David S. Miller" Date: Fri, 27 Jan 2012 15:07:56 -0800 Subject: [PATCH] --- yaml --- r: 289779 b: refs/heads/master c: eb857186eb771998fc9ab4bfd398a6fedb5a295c h: refs/heads/master i: 289777: 6651966b8b9ebda6b31de3d06867a5baa3017d4c 289775: 5f19990d18da21a1d137e13f4e35ee1a88a6270b v: v3 --- [refs] | 2 +- trunk/net/ipv6/ndisc.c | 18 ++++++++++++------ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/[refs] b/[refs] index 951296a04277..d0a4dd47d34a 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 0ec88662041e172acf33d7a15a2020841ee82afb +refs/heads/master: eb857186eb771998fc9ab4bfd398a6fedb5a295c diff --git a/trunk/net/ipv6/ndisc.c b/trunk/net/ipv6/ndisc.c index d8f02ef88e59..c574ebce3fb5 100644 --- a/trunk/net/ipv6/ndisc.c +++ b/trunk/net/ipv6/ndisc.c @@ -1223,11 +1223,17 @@ static void ndisc_router_discovery(struct sk_buff *skb) rt = rt6_get_dflt_router(&ipv6_hdr(skb)->saddr, skb->dev); - if (rt) - neigh = dst_get_neighbour_noref(&rt->dst); - + if (rt) { + neigh = dst_neigh_lookup(&rt->dst, &ipv6_hdr(skb)->saddr); + if (!neigh) { + ND_PRINTK0(KERN_ERR + "ICMPv6 RA: %s() got default router without neighbour.\n", + __func__); + dst_release(&rt->dst); + return; + } + } if (rt && lifetime == 0) { - neigh_clone(neigh); ip6_del_rt(rt); rt = NULL; } @@ -1244,7 +1250,7 @@ static void ndisc_router_discovery(struct sk_buff *skb) return; } - neigh = dst_get_neighbour_noref(&rt->dst); + neigh = dst_neigh_lookup(&rt->dst, &ipv6_hdr(skb)->saddr); if (neigh == NULL) { ND_PRINTK0(KERN_ERR "ICMPv6 RA: %s() got default router without neighbour.\n", @@ -1411,7 +1417,7 @@ static void ndisc_router_discovery(struct sk_buff *skb) out: if (rt) dst_release(&rt->dst); - else if (neigh) + if (neigh) neigh_release(neigh); }