diff options
author | YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org> | 2008-06-25 03:26:47 -0400 |
---|---|---|
committer | YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org> | 2008-07-03 04:51:55 -0400 |
commit | d68b82705a4a754e5773f412c6b8f1e65259bc8b (patch) | |
tree | 3bd32bb16b1e462d9c8be37f3b60ca2ec346d003 /net/ipv6/addrconf.c | |
parent | b4653e99450693b75a3c6c8ff4f070164f12815e (diff) |
ipv6: Do not assign non-valid address on interface.
Check the type of the address when adding a new one on interface.
- the unspecified address (::) is always disallowed (RFC4291 2.5.2)
- the loopback address is disallowed unless the interface is (one of)
loopback (RFC4291 2.5.3).
- multicast addresses are disallowed.
Signed-off-by: YOSHIFUJI Hideaki <yoshfuji@linux-ipv6.org>
Diffstat (limited to 'net/ipv6/addrconf.c')
-rw-r--r-- | net/ipv6/addrconf.c | 7 |
1 files changed, 7 insertions, 0 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 84127d854cfc..8b6875f02039 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -578,6 +578,13 @@ ipv6_add_addr(struct inet6_dev *idev, const struct in6_addr *addr, int pfxlen, | |||
578 | struct rt6_info *rt; | 578 | struct rt6_info *rt; |
579 | int hash; | 579 | int hash; |
580 | int err = 0; | 580 | int err = 0; |
581 | int addr_type = ipv6_addr_type(addr); | ||
582 | |||
583 | if (addr_type == IPV6_ADDR_ANY || | ||
584 | addr_type & IPV6_ADDR_MULTICAST || | ||
585 | (!(idev->dev->flags & IFF_LOOPBACK) && | ||
586 | addr_type & IPV6_ADDR_LOOPBACK)) | ||
587 | return ERR_PTR(-EADDRNOTAVAIL); | ||
581 | 588 | ||
582 | rcu_read_lock_bh(); | 589 | rcu_read_lock_bh(); |
583 | if (idev->dead) { | 590 | if (idev->dead) { |