Message ID | 50F587CF.1090306@linux-ipv6.org |
---|---|
State | RFC, archived |
Delegated to: | David Miller |
Headers | show |
s/deoend/depend/ in $subject... On 01/16/2013 12:46 AM, YOSHIFUJI Hideaki wrote: > Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org> > --- > net/ipv6/ip6_output.c | 8 ++++++-- > 1 file changed, 6 insertions(+), 2 deletions(-) > > diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c > index 9fc5d1d..b2fe048 100644 > --- a/net/ipv6/ip6_output.c > +++ b/net/ipv6/ip6_output.c > @@ -921,8 +921,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) { Are you sure the logic here equals? In the original code, we could return 0 even we enter this if branch, but after your patch, it seems it will return -EINVAL? -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Cong Wang wrote: > s/deoend/depend/ in $subject... > > On 01/16/2013 12:46 AM, YOSHIFUJI Hideaki wrote: >> Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org> >> --- >> net/ipv6/ip6_output.c | 8 ++++++-- >> 1 file changed, 6 insertions(+), 2 deletions(-) >> >> diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c >> index 9fc5d1d..b2fe048 100644 >> --- a/net/ipv6/ip6_output.c >> +++ b/net/ipv6/ip6_output.c >> @@ -921,8 +921,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) { > > Are you sure the logic here equals? > > In the original code, we could return 0 even we enter this if branch, > but after your patch, it seems it will return -EINVAL? > err is always updated after the branch, or return 0; --yoshfuji -- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index 9fc5d1d..b2fe048 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c @@ -921,8 +921,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;
Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org> --- net/ipv6/ip6_output.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-)