Commit 69e949a5 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

- Fix very likely race condition

  (whereby psz_bind_addr would be modified by another call to inet_ntoa)
- Use net_GetSockAddress
parent a16c7459
...@@ -415,7 +415,7 @@ static int Read( access_t *p_access, uint8_t *p_buffer, int i_len ) ...@@ -415,7 +415,7 @@ static int Read( access_t *p_access, uint8_t *p_buffer, int i_len )
i_data = 0; i_data = 0;
/* *** now send data if needed *** */ /* *** now send data if needed *** */
while( i_data < i_len ) while( i_data < (size_t)i_len )
{ {
if( p_access->info.i_pos < p_sys->i_header ) if( p_access->info.i_pos < p_sys->i_header )
{ {
...@@ -490,24 +490,15 @@ static int MMSOpen( access_t *p_access, vlc_url_t *p_url, int i_proto ) ...@@ -490,24 +490,15 @@ static int MMSOpen( access_t *p_access, vlc_url_t *p_url, int i_proto )
/* *** Bind port if UDP protocol is selected *** */ /* *** Bind port if UDP protocol is selected *** */
if( b_udp ) if( b_udp )
{ {
struct sockaddr_storage name; if( net_GetSockAddress( p_access, p_sys->i_handle_tcp,
socklen_t i_namelen = sizeof( name ); p_sys->sz_bind_addr, NULL ) )
if( getsockname( p_sys->i_handle_tcp,
(struct sockaddr*)&name, &i_namelen ) < 0 )
{ {
net_Close( p_sys->i_handle_tcp ); net_Close( p_sys->i_handle_tcp );
return VLC_EGENERIC; return VLC_EGENERIC;
} }
/* FIXME: not thread-safe for IPv4 */ p_sys->i_handle_udp = net_OpenUDP( p_access, p_sys->sz_bind_addr,
/* FIXME: not sure if it works fine for IPv6 */ 7000, "", 0 );
if( name.ss_family == AF_INET )
p_sys->psz_bind_addr = inet_ntoa( ((struct sockaddr_in *)&name)->sin_addr );
else
p_sys->psz_bind_addr = p_url->psz_host;
p_sys->i_handle_udp = net_OpenUDP( p_access, p_sys->psz_bind_addr, 7000, "", 0 );
if( p_sys->i_handle_udp < 0 ) if( p_sys->i_handle_udp < 0 )
{ {
msg_Err( p_access, "failed to open a connection (udp)" ); msg_Err( p_access, "failed to open a connection (udp)" );
...@@ -516,11 +507,7 @@ static int MMSOpen( access_t *p_access, vlc_url_t *p_url, int i_proto ) ...@@ -516,11 +507,7 @@ static int MMSOpen( access_t *p_access, vlc_url_t *p_url, int i_proto )
} }
msg_Dbg( p_access, msg_Dbg( p_access,
"connection(udp) at \"%s:%d\" successful", "connection(udp) at \"%s:%d\" successful",
p_sys->psz_bind_addr, 7000 ); p_sys->sz_bind_addr, 7000 );
}
else
{
p_sys->psz_bind_addr = NULL;
} }
/* *** Init context for mms prototcol *** */ /* *** Init context for mms prototcol *** */
...@@ -610,7 +597,7 @@ static int MMSOpen( access_t *p_access, vlc_url_t *p_url, int i_proto ) ...@@ -610,7 +597,7 @@ static int MMSOpen( access_t *p_access, vlc_url_t *p_url, int i_proto )
{ {
sprintf( tmp, sprintf( tmp,
"\\\\%s\\UDP\\%d", "\\\\%s\\UDP\\%d",
p_sys->psz_bind_addr, p_sys->sz_bind_addr,
7000 ); // FIXME 7000 ); // FIXME
} }
else else
......
...@@ -37,7 +37,7 @@ struct access_sys_t ...@@ -37,7 +37,7 @@ struct access_sys_t
int i_handle_tcp; /* TCP socket for communication with server */ int i_handle_tcp; /* TCP socket for communication with server */
int i_handle_udp; /* Optional UDP socket for data(media/header packet) */ int i_handle_udp; /* Optional UDP socket for data(media/header packet) */
/* send by server */ /* send by server */
char *psz_bind_addr; /* used by udp */ char sz_bind_addr[NI_MAXNUMERICHOST]; /* used by udp */
vlc_url_t url; vlc_url_t url;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment