diff options
author | Timur Bakeyev <timur@FreeBSD.org> | 2013-02-27 16:25:07 -0800 |
---|---|---|
committer | Jeremy Allison <jra@samba.org> | 2013-02-28 20:56:57 +0100 |
commit | 8ac431a22e45611d4bbded67c4c8bd864c343a8f (patch) | |
tree | 289a7e89728efcc621623937a1e23ee4b1ea6b40 /lib | |
parent | 61f34e2d25058452ab16f9d7ec5fc2776ab135eb (diff) | |
download | samba-8ac431a22e45611d4bbded67c4c8bd864c343a8f.tar.gz samba-8ac431a22e45611d4bbded67c4c8bd864c343a8f.tar.bz2 samba-8ac431a22e45611d4bbded67c4c8bd864c343a8f.zip |
Fix bug # 9666 - Broken filtering of link-local addresses.
This patch should address the problem with Link Local addresses
on FreeBSD and Linux.
Reviewed-by: Jeremy Allison <jra@samba.org>
Reviewed-by: Richard Sharpe <rsharpe@samba.org>
Autobuild-User(master): Jeremy Allison <jra@samba.org>
Autobuild-Date(master): Thu Feb 28 20:56:57 CET 2013 on sn-devel-104
Diffstat (limited to 'lib')
-rw-r--r-- | lib/socket/interfaces.c | 28 |
1 files changed, 15 insertions, 13 deletions
diff --git a/lib/socket/interfaces.c b/lib/socket/interfaces.c index 74c642372a..e62da3c3a1 100644 --- a/lib/socket/interfaces.c +++ b/lib/socket/interfaces.c @@ -186,6 +186,21 @@ static int _get_interfaces(TALLOC_CTX *mem_ctx, struct iface_struct **pifaces) memcpy(&ifaces[total].ip, ifptr->ifa_addr, copy_size); memcpy(&ifaces[total].netmask, ifptr->ifa_netmask, copy_size); + /* calculate broadcast address */ +#if defined(HAVE_IPV6) + if (ifptr->ifa_addr->sa_family == AF_INET6) { + struct sockaddr_in6 *sin6 = + (struct sockaddr_in6 *)ifptr->ifa_addr; + struct in6_addr *in6 = + (struct in6_addr *)&sin6->sin6_addr; + + if (IN6_IS_ADDR_LINKLOCAL(in6) || IN6_IS_ADDR_V4COMPAT(in6)) { + continue; + } + /* IPv6 does not have broadcast it uses multicast. */ + memset(&ifaces[total].bcast, '\0', copy_size); + } else +#endif if (ifaces[total].flags & (IFF_BROADCAST|IFF_LOOPBACK)) { make_bcast(&ifaces[total].bcast, &ifaces[total].ip, @@ -195,19 +210,6 @@ static int _get_interfaces(TALLOC_CTX *mem_ctx, struct iface_struct **pifaces) memcpy(&ifaces[total].bcast, ifptr->ifa_dstaddr, copy_size); -#if defined(HAVE_IPV6) - } else if (ifptr->ifa_addr->sa_family == AF_INET6) { - const struct sockaddr_in6 *sin6 = - (const struct sockaddr_in6 *)ifptr->ifa_addr; - const struct in6_addr *in6 = - (const struct in6_addr *)&sin6->sin6_addr; - - if (IN6_IS_ADDR_LINKLOCAL(in6) || IN6_IS_ADDR_V4COMPAT(in6)) { - continue; - } - /* IPv6 does not have broadcast it uses multicast. */ - memset(&ifaces[total].bcast, '\0', copy_size); -#endif } else { continue; } |