Mercurial > hg > freeDiameter
changeset 178:a32646b7e7d7
Filter more addresses out, such as link-local
author | Sebastien Decugis <sdecugis@nict.go.jp> |
---|---|
date | Wed, 03 Feb 2010 17:01:01 +0900 |
parents | 09b9cb9cfd01 |
children | 0ea50d66ad1b |
files | freeDiameter/endpoints.c |
diffstat | 1 files changed, 12 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/freeDiameter/endpoints.c Wed Feb 03 16:44:34 2010 +0900 +++ b/freeDiameter/endpoints.c Wed Feb 03 17:01:01 2010 +0900 @@ -51,17 +51,26 @@ TRACE_ENTRY("%p %p %u %x", list, sa, sl, flags); CHECK_PARAMS( list && sa && (sl <= sizeof(sSS)) ); - /* Filter out loopback addresses, unspecified addresses, and invalid families */ + /* Filter out a bunch of invalid addresses */ if (! (flags & EP_ACCEPTALL)) { ptr.sa = sa; switch (sa->sa_family) { case AF_INET: - if (IN_IS_ADDR_UNSPECIFIED(&ptr.sin->sin_addr) || IN_IS_ADDR_LOOPBACK(&ptr.sin->sin_addr)) + if (IN_IS_ADDR_UNSPECIFIED(&ptr.sin->sin_addr) + || IN_IS_ADDR_LOOPBACK(&ptr.sin->sin_addr) + || IN_MULTICAST(ptr.sin->sin_addr.s_addr) + || IN_EXPERIMENTAL(ptr.sin->sin_addr.s_addr) + || IN_BADCLASS(ptr.sin->sin_addr.s_addr) + || (ptr.sin->sin_addr.s_addr == INADDR_BROADCAST)) return 0; break; case AF_INET6: - if (IN6_IS_ADDR_UNSPECIFIED(&ptr.sin6->sin6_addr) || IN6_IS_ADDR_LOOPBACK(&ptr.sin6->sin6_addr)) + if (IN6_IS_ADDR_UNSPECIFIED(&ptr.sin6->sin6_addr) + || IN6_IS_ADDR_LOOPBACK(&ptr.sin6->sin6_addr) + || IN6_IS_ADDR_MULTICAST(&ptr.sin6->sin6_addr) + || IN6_IS_ADDR_LINKLOCAL(&ptr.sin6->sin6_addr) + || IN6_IS_ADDR_SITELOCAL(&ptr.sin6->sin6_addr)) return 0; break;