forked from Minki/linux
ipv6: don't reject link-local nexthop on other interface
48ed7b26fa
("ipv6: reject locally assigned nexthop addresses") is too strict; it rejects following corner-case: ip -6 route add default via fe80::1:2:3 dev eth1 [ where fe80::1:2:3 is assigned to a local interface, but not eth1 ] Fix this by restricting search to given device if nh is linklocal. Joint work with Hannes Frederic Sowa. Fixes:48ed7b26fa
("ipv6: reject locally assigned nexthop addresses") Signed-off-by: Hannes Frederic Sowa <hannes@stressinduktion.org> Signed-off-by: Florian Westphal <fw@strlen.de> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
4e7c133068
commit
330567b71d
@ -1831,6 +1831,7 @@ int ip6_route_add(struct fib6_config *cfg)
|
||||
int gwa_type;
|
||||
|
||||
gw_addr = &cfg->fc_gateway;
|
||||
gwa_type = ipv6_addr_type(gw_addr);
|
||||
|
||||
/* if gw_addr is local we will fail to detect this in case
|
||||
* address is still TENTATIVE (DAD in progress). rt6_lookup()
|
||||
@ -1838,11 +1839,12 @@ int ip6_route_add(struct fib6_config *cfg)
|
||||
* prefix route was assigned to, which might be non-loopback.
|
||||
*/
|
||||
err = -EINVAL;
|
||||
if (ipv6_chk_addr_and_flags(net, gw_addr, NULL, 0, 0))
|
||||
if (ipv6_chk_addr_and_flags(net, gw_addr,
|
||||
gwa_type & IPV6_ADDR_LINKLOCAL ?
|
||||
dev : NULL, 0, 0))
|
||||
goto out;
|
||||
|
||||
rt->rt6i_gateway = *gw_addr;
|
||||
gwa_type = ipv6_addr_type(gw_addr);
|
||||
|
||||
if (gwa_type != (IPV6_ADDR_LINKLOCAL|IPV6_ADDR_UNICAST)) {
|
||||
struct rt6_info *grt;
|
||||
|
Loading…
Reference in New Issue
Block a user