aboutsummaryrefslogtreecommitdiffstats
path: root/main
diff options
context:
space:
mode:
authorrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2010-10-18 19:50:04 +0000
committerrussell <russell@f38db490-d61c-443f-a65b-d21fe96a405b>2010-10-18 19:50:04 +0000
commitd8a6e8943b8214205071ebefcf735ff10545f56e (patch)
treefdf74cadb39f471293f4500f74e561e512c6ef93 /main
parent4807c7d193ebbadfef2624846462f5ead00a31a1 (diff)
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: http://svn.digium.com/svn/asterisk/branches/1.8@292188 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'main')
-rw-r--r--main/netsock2.c15
1 files changed, 10 insertions, 5 deletions
diff --git a/main/netsock2.c b/main/netsock2.c
index 80dc355ee..e575bcfa2 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)