Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
V
vlc-1.1
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
videolan
vlc-1.1
Commits
971c60c8
Commit
971c60c8
authored
May 31, 2009
by
Rémi Denis-Courmont
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
SAP_Add: use a union to fix aliasing bug
parent
0b033e01
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
21 additions
and
17 deletions
+21
-17
src/stream_output/sap.c
src/stream_output/sap.c
+21
-17
No files found.
src/stream_output/sap.c
View file @
971c60c8
...
@@ -214,7 +214,12 @@ int SAP_Add (sap_handler_t *p_sap, session_descriptor_t *p_session)
...
@@ -214,7 +214,12 @@ int SAP_Add (sap_handler_t *p_sap, session_descriptor_t *p_session)
bool
b_ipv6
=
false
,
b_ssm
=
false
;
bool
b_ipv6
=
false
,
b_ssm
=
false
;
sap_session_t
*
p_sap_session
;
sap_session_t
*
p_sap_session
;
mtime_t
i_hash
;
mtime_t
i_hash
;
struct
sockaddr_storage
addr
;
union
{
struct
sockaddr
a
;
struct
sockaddr_in
in
;
struct
sockaddr_in6
in6
;
}
addr
;
socklen_t
addrlen
;
socklen_t
addrlen
;
addrlen
=
p_session
->
addrlen
;
addrlen
=
p_session
->
addrlen
;
...
@@ -227,13 +232,13 @@ int SAP_Add (sap_handler_t *p_sap, session_descriptor_t *p_session)
...
@@ -227,13 +232,13 @@ int SAP_Add (sap_handler_t *p_sap, session_descriptor_t *p_session)
/* Determine SAP multicast address automatically */
/* Determine SAP multicast address automatically */
memcpy
(
&
addr
,
&
p_session
->
addr
,
addrlen
);
memcpy
(
&
addr
,
&
p_session
->
addr
,
addrlen
);
switch
(
p_session
->
addr
.
ss_family
)
switch
(
addr
.
a
.
sa_family
)
{
{
#if defined (HAVE_INET_PTON) || defined (WIN32)
#if defined (HAVE_INET_PTON) || defined (WIN32)
case
AF_INET6
:
case
AF_INET6
:
{
{
/* See RFC3513 for list of valid IPv6 scopes */
/* 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
"
memcpy
(
a6
->
s6_addr
+
2
,
"
\x00\x00\x00\x00\x00\x00
"
"
\x00\x00\x00\x00\x00\x02\x7f\xfe
"
,
14
);
"
\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)
...
@@ -257,29 +262,28 @@ int SAP_Add (sap_handler_t *p_sap, session_descriptor_t *p_session)
case
AF_INET
:
case
AF_INET
:
{
{
/* See RFC2365 for IPv4 scopes */
/* 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 */
/* 224.0.0.0/24 => 224.0.0.255 */
if
((
ipv4
&
0xffffff00
)
==
0xe0000000
)
if
((
ipv4
&
htonl
(
0xffffff00
))
==
htonl
(
0xe0000000
)
)
ipv4
=
0xe00000ff
;
ipv4
=
htonl
(
0xe00000ff
)
;
else
else
/* 239.255.0.0/16 => 239.255.255.255 */
/* 239.255.0.0/16 => 239.255.255.255 */
if
((
ipv4
&
0xffff0000
)
==
0xefff0000
)
if
((
ipv4
&
htonl
(
0xffff0000
))
==
htonl
(
0xefff0000
)
)
ipv4
=
0xefffffff
;
ipv4
=
htonl
(
0xefffffff
)
;
else
else
/* 239.192.0.0/14 => 239.195.255.255 */
/* 239.192.0.0/14 => 239.195.255.255 */
if
((
ipv4
&
0xfffc0000
)
==
0xefc00000
)
if
((
ipv4
&
htonl
(
0xfffc0000
))
==
htonl
(
0xefc00000
)
)
ipv4
=
0xefc3ffff
;
ipv4
=
htonl
(
0xefc3ffff
)
;
else
else
if
((
ipv4
&
0xff000000
)
==
0xef000000
)
if
((
ipv4
&
htonl
(
0xff000000
))
==
htonl
(
0xef000000
)
)
ipv4
=
0
;
ipv4
=
0
;
else
else
/* other addresses => 224.2.127.254 */
/* other addresses => 224.2.127.254 */
{
{
/* SSM: 232.0.0.0/8 */
/* SSM: 232.0.0.0/8 */
b_ssm
=
(
ipv4
>>
24
)
==
232
;
b_ssm
=
(
ipv4
&
htonl
(
255
<<
24
))
==
htonl
(
232
<<
24
)
;
ipv4
=
0xe0027ffe
;
ipv4
=
htonl
(
0xe0027ffe
)
;
}
}
if
(
ipv4
==
0
)
if
(
ipv4
==
0
)
...
@@ -289,17 +293,17 @@ int SAP_Add (sap_handler_t *p_sap, session_descriptor_t *p_session)
...
@@ -289,17 +293,17 @@ int SAP_Add (sap_handler_t *p_sap, session_descriptor_t *p_session)
return
VLC_EGENERIC
;
return
VLC_EGENERIC
;
}
}
((
struct
sockaddr_in
*
)
&
addr
)
->
sin_addr
.
s_addr
=
htonl
(
ipv4
)
;
addr
.
in
.
sin_addr
.
s_addr
=
ipv4
;
break
;
break
;
}
}
default:
default:
msg_Err
(
p_sap
,
"Address family %d not supported by SAP"
,
msg_Err
(
p_sap
,
"Address family %d not supported by SAP"
,
addr
.
ss
_family
);
addr
.
a
.
sa
_family
);
return
VLC_EGENERIC
;
return
VLC_EGENERIC
;
}
}
i
=
vlc_getnameinfo
(
(
struct
sockaddr
*
)
&
addr
,
addrlen
,
i
=
vlc_getnameinfo
(
&
addr
.
a
,
addrlen
,
psz_addr
,
sizeof
(
psz_addr
),
NULL
,
NI_NUMERICHOST
);
psz_addr
,
sizeof
(
psz_addr
),
NULL
,
NI_NUMERICHOST
);
if
(
i
)
if
(
i
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment