[vlc-devel] commit: SAP_Add: use a union to fix aliasing bug ( Rémi Denis-Courmont )
git version control
git at videolan.org
Sun May 31 21:27:45 CEST 2009
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sun May 31 22:27:25 2009 +0300| [8d812e0a8417d97334ad008185cd9ece30294ab3] | committer: Rémi Denis-Courmont
SAP_Add: use a union to fix aliasing bug
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=8d812e0a8417d97334ad008185cd9ece30294ab3
---
src/stream_output/sap.c | 38 +++++++++++++++++++++-----------------
1 files changed, 21 insertions(+), 17 deletions(-)
diff --git a/src/stream_output/sap.c b/src/stream_output/sap.c
index e719061..d2fcd92 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 )
More information about the vlc-devel
mailing list