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;
 
"Welcome to our mercurial repository"