diff options
author | Martin KaFai Lau <kafai@fb.com> | 2015-01-20 19:16:02 -0800 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-01-25 22:09:51 -0800 |
commit | b0a1ba59921eaaa9cb8f97bb35f2e6870fcdfedc (patch) | |
tree | 5db7467e7b5ff0163499cb807a8835642190245e | |
parent | 24df8986f36b9a5d8ae08236498d92267bac454b (diff) | |
download | linux-b0a1ba59921eaaa9cb8f97bb35f2e6870fcdfedc.tar.gz linux-b0a1ba59921eaaa9cb8f97bb35f2e6870fcdfedc.tar.bz2 linux-b0a1ba59921eaaa9cb8f97bb35f2e6870fcdfedc.zip |
ipv6: Fix __ip6_route_redirect
In my last commit (a3c00e4: ipv6: Remove BACKTRACK macro), the changes in
__ip6_route_redirect is incorrect. The following case is missed:
1. The for loop tries to find a valid gateway rt. If it fails to find
one, rt will be NULL.
2. When rt is NULL, it is set to the ip6_null_entry.
3. The newly added 'else if', from a3c00e4, will stop the backtrack from
happening.
Signed-off-by: Martin KaFai Lau <kafai@fb.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | net/ipv6/route.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 166e33bed222..495965358d22 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c @@ -1242,12 +1242,16 @@ restart: rt = net->ipv6.ip6_null_entry; else if (rt->dst.error) { rt = net->ipv6.ip6_null_entry; - } else if (rt == net->ipv6.ip6_null_entry) { + goto out; + } + + if (rt == net->ipv6.ip6_null_entry) { fn = fib6_backtrack(fn, &fl6->saddr); if (fn) goto restart; } +out: dst_hold(&rt->dst); read_unlock_bh(&table->tb6_lock); |