Mercurial > hg > freeDiameter
changeset 135:bbb8ddba4c85
Filter out more invalid addresses
author | Sebastien Decugis <sdecugis@nict.go.jp> |
---|---|
date | Wed, 16 Dec 2009 14:44:56 +0900 |
parents | 6b2989c066a6 |
children | abd3c441780b |
files | freeDiameter/endpoints.c include/freeDiameter/libfreeDiameter.h |
diffstat | 2 files changed, 15 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/freeDiameter/endpoints.c Tue Dec 15 18:15:41 2009 +0900 +++ b/freeDiameter/endpoints.c Wed Dec 16 14:44:56 2009 +0900 @@ -51,15 +51,21 @@ TRACE_ENTRY("%p %p %u %x", list, sa, sl, flags); CHECK_PARAMS( list && sa && (sl <= sizeof(sSS)) ); - /* Filter out loopback addresses */ + /* Filter out loopback addresses, unspecified addresses, and invalid families */ ptr.sa = sa; switch (sa->sa_family) { case AF_INET: - if (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)) return 0; + break; + case AF_INET6: - if (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)) return 0; + break; + + default: + return 0; } /* Search place in the list */
--- a/include/freeDiameter/libfreeDiameter.h Tue Dec 15 18:15:41 2009 +0900 +++ b/include/freeDiameter/libfreeDiameter.h Wed Dec 16 14:44:56 2009 +0900 @@ -400,6 +400,12 @@ ((((long int) (a)->s_addr) & ntohl(0xff000000)) == ntohl(0x7f000000)) #endif /* IN_IS_ADDR_LOOPBACK */ +/* An IP equivalent to IN6_IS_ADDR_UNSPECIFIED */ +#ifndef IN_IS_ADDR_UNSPECIFIED +#define IN_IS_ADDR_UNSPECIFIED(a) \ + (((long int) (a)->s_addr) == 0x00000000) +#endif /* IN_IS_ADDR_UNSPECIFIED */ + /* create a V4MAPPED address */ #define IN6_ADDR_V4MAP( a6, a4 ) { \