From 8d812e0a8417d97334ad008185cd9ece30294ab3 Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9mi=20Denis-Courmont?= Date: Sun, 31 May 2009 22:27:25 +0300 Subject: [PATCH] SAP_Add: use a union to fix aliasing bug --- src/stream_output/sap.c | 38 +++++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/src/stream_output/sap.c b/src/stream_output/sap.c index e71906114d..d2fcd92889 100644 --- a/src/stream_output/sap.c +++ b/src/stream_output/sap.c @@ -214,7 +214,12 @@ int SAP_Add (sap_handler_t *p_sap, session_descriptor_t *p_session) bool b_ipv6 = false, b_ssm = false; sap_session_t *p_sap_session; mtime_t i_hash; - struct sockaddr_storage addr; + union + { + struct sockaddr a; + struct sockaddr_in in; + struct sockaddr_in6 in6; + } addr; socklen_t addrlen; addrlen = p_session->addrlen; @@ -227,13 +232,13 @@ int SAP_Add (sap_handler_t *p_sap, session_descriptor_t *p_session) /* Determine SAP multicast address automatically */ memcpy (&addr, &p_session->addr, addrlen); - switch( p_session->addr.ss_family ) + switch (addr.a.sa_family) { #if defined (HAVE_INET_PTON) || defined (WIN32) case AF_INET6: { /* See RFC3513 for list of valid IPv6 scopes */ - struct in6_addr *a6 = &((struct sockaddr_in6 *)&addr)->sin6_addr; + struct in6_addr *a6 = &addr.in6.sin6_addr; memcpy( a6->s6_addr + 2, "\x00\x00\x00\x00\x00\x00" "\x00\x00\x00\x00\x00\x02\x7f\xfe", 14 ); @@ -257,29 +262,28 @@ int SAP_Add (sap_handler_t *p_sap, session_descriptor_t *p_session) case AF_INET: { /* See RFC2365 for IPv4 scopes */ - uint32_t ipv4; + uint32_t ipv4 = addr.in.sin_addr.s_addr; - ipv4 = ntohl( ((struct sockaddr_in *)&addr)->sin_addr.s_addr ); /* 224.0.0.0/24 => 224.0.0.255 */ - if ((ipv4 & 0xffffff00) == 0xe0000000) - ipv4 = 0xe00000ff; + if ((ipv4 & htonl (0xffffff00)) == htonl (0xe0000000)) + ipv4 = htonl (0xe00000ff); else /* 239.255.0.0/16 => 239.255.255.255 */ - if ((ipv4 & 0xffff0000) == 0xefff0000) - ipv4 = 0xefffffff; + if ((ipv4 & htonl (0xffff0000)) == htonl (0xefff0000)) + ipv4 = htonl (0xefffffff); else /* 239.192.0.0/14 => 239.195.255.255 */ - if ((ipv4 & 0xfffc0000) == 0xefc00000) - ipv4 = 0xefc3ffff; + if ((ipv4 & htonl (0xfffc0000)) == htonl (0xefc00000)) + ipv4 = htonl (0xefc3ffff); else - if ((ipv4 & 0xff000000) == 0xef000000) + if ((ipv4 & htonl (0xff000000)) == htonl (0xef000000)) ipv4 = 0; else /* other addresses => 224.2.127.254 */ { /* SSM: 232.0.0.0/8 */ - b_ssm = (ipv4 >> 24) == 232; - ipv4 = 0xe0027ffe; + b_ssm = (ipv4 & htonl (255 << 24)) == htonl (232 << 24); + ipv4 = htonl (0xe0027ffe); } if( ipv4 == 0 ) @@ -289,17 +293,17 @@ int SAP_Add (sap_handler_t *p_sap, session_descriptor_t *p_session) return VLC_EGENERIC; } - ((struct sockaddr_in *)&addr)->sin_addr.s_addr = htonl( ipv4 ); + addr.in.sin_addr.s_addr = ipv4; break; } default: msg_Err( p_sap, "Address family %d not supported by SAP", - addr.ss_family ); + addr.a.sa_family ); return VLC_EGENERIC; } - i = vlc_getnameinfo( (struct sockaddr *)&addr, addrlen, + i = vlc_getnameinfo( &addr.a, addrlen, psz_addr, sizeof( psz_addr ), NULL, NI_NUMERICHOST ); if( i ) -- 2.39.2