From: YOSHIFUJI Hideaki Date: Wed, 25 Jun 2008 07:26:47 +0000 (+0900) Subject: ipv6: Do not assign non-valid address on interface. X-Git-Url: http://drtracing.org/?a=commitdiff_plain;h=d68b82705a4a754e5773f412c6b8f1e65259bc8b;p=deliverable%2Flinux.git 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 --- 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, struct rt6_info *rt; int hash; int err = 0; + int addr_type = ipv6_addr_type(addr); + + if (addr_type == IPV6_ADDR_ANY || + addr_type & IPV6_ADDR_MULTICAST || + (!(idev->dev->flags & IFF_LOOPBACK) && + addr_type & IPV6_ADDR_LOOPBACK)) + return ERR_PTR(-EADDRNOTAVAIL); rcu_read_lock_bh(); if (idev->dead) {