Merged revisions 292188 via svnmerge from
authorRussell Bryant <russell@russellbryant.com>
Mon, 18 Oct 2010 19:52:58 +0000 (19:52 +0000)
committerRussell Bryant <russell@russellbryant.com>
Mon, 18 Oct 2010 19:52:58 +0000 (19:52 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.8

........
  r292188 | russell | 2010-10-18 14:50:04 -0500 (Mon, 18 Oct 2010) | 9 lines

  Resolve some compiler errors in ast_sockaddr_is_any().

  These errors came up once this function was used from within netsock2.c.
  The errors were like the following:

  netsock2.c:393: error: dereferencing pointer ‘({anonymous})’ does break strict-aliasing rules

  The usage of a union here avoids this problem.
........

git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@292189 65c4cc65-6c06-0410-ace0-fbb531ad65f3

main/netsock2.c

index 80dc355..e575bcf 100644 (file)
@@ -389,11 +389,16 @@ int ast_sockaddr_is_ipv6(const struct ast_sockaddr *addr)
 
 int ast_sockaddr_is_any(const struct ast_sockaddr *addr)
 {
-       return (ast_sockaddr_is_ipv4(addr) &&
-               ((const struct sockaddr_in *)&addr->ss)->sin_addr.s_addr ==
-               INADDR_ANY) ||
-           (ast_sockaddr_is_ipv6(addr) &&
-            IN6_IS_ADDR_UNSPECIFIED(&((const struct sockaddr_in6 *)&addr->ss)->sin6_addr));
+       union {
+               struct sockaddr_storage ss;
+               struct sockaddr_in sin;
+               struct sockaddr_in6 sin6;
+       } tmp_addr = {
+               .ss = addr->ss,
+       };
+
+       return (ast_sockaddr_is_ipv4(addr) && (tmp_addr.sin.sin_addr.s_addr == INADDR_ANY)) ||
+           (ast_sockaddr_is_ipv6(addr) && IN6_IS_ADDR_UNSPECIFIED(&tmp_addr.sin6.sin6_addr));
 }
 
 int ast_sockaddr_hash(const struct ast_sockaddr *addr)