From 84cbd3249af7dce348c6097fb1fff3887aa814fd Mon Sep 17 00:00:00 2001 From: Russell Bryant Date: Mon, 18 Oct 2010 19:52:58 +0000 Subject: [PATCH] Merged revisions 292188 via svnmerge from https://origsvn.digium.com/svn/asterisk/branches/1.8 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ........ 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 | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/main/netsock2.c b/main/netsock2.c index 80dc355eee..e575bcfa23 100644 --- a/main/netsock2.c +++ b/main/netsock2.c @@ -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)