ipv6: Do not depend on rt->n in ip6_dst_lookup_tail().
authorYOSHIFUJI Hideaki / 吉藤英明 <yoshfuji@linux-ipv6.org>
Thu, 17 Jan 2013 12:53:55 +0000 (12:53 +0000)
committerDavid S. Miller <davem@davemloft.net>
Thu, 17 Jan 2013 23:38:19 +0000 (18:38 -0500)
Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv6/ip6_output.c

index 9250c696de9dafdc22b1824b1f59298bd7299377..7c00edb343a09f7f975c1631aa9561f1a2f57f2b 100644 (file)
@@ -913,8 +913,12 @@ static int ip6_dst_lookup_tail(struct sock *sk,
         * dst entry of the nexthop router
         */
        rt = (struct rt6_info *) *dst;
-       n = rt->n;
-       if (n && !(n->nud_state & NUD_VALID)) {
+       rcu_read_lock_bh();
+       n = __ipv6_neigh_lookup_noref(rt->dst.dev, rt6_nexthop(rt, &fl6->daddr));
+       err = n && !(n->nud_state & NUD_VALID) ? -EINVAL : 0;
+       rcu_read_unlock_bh();
+
+       if (err) {
                struct inet6_ifaddr *ifp;
                struct flowi6 fl_gw6;
                int redirect;