[vlc-devel] Incorrect connect() call after SSM join

Alexander Gall gall at switch.ch
Wed Mar 1 11:06:39 CET 2006


There is a flaw in modules/misc/network/ipv{4,6}.c:OpenUDP() when an
SSM channel is joined.  The logic is roughly this pseudocode
(bind_addr and server_addr are passed from the caller)

s = socket(SOCK_DGRAM)
if (!bind_addr) {
   bind_addr = addr_any
}
bind(s, bind_addr)
if (is_multicast_addr(bind_addr)) {
   if (server_addr) {
      join_ssm(s, bind_addr, server_addr)
   } else {
      join_asm(s, bind_addr)
   }
}

if (server_addr) {
   connect(s, server_addr)
   set_ttl()
   set_mcast_output_interface()
}     

The last block should only be executed when receiving/sending a
unicast stream from/to server_addr or when sending to a multicast
group, but not when joining an SSM channel.  On Solaris, the connect()
call returns EADDRNOTAVAIL (can't assign requested address) in this
case, which breaks SSM completely on this platform.  On Linux, the
call doesn't seem to have an effect and doesn't return an error.  I
think the proper thing to do is to skip this part for SSM.  That's
what my patch does.

--
Alex


diff -Naur vlc-0.8.5-20060226.orig/modules/misc/network/ipv4.c vlc-0.8.5-20060226/modules/misc/network/ipv4.c
--- vlc-0.8.5-20060226.orig/modules/misc/network/ipv4.c 2006-02-26 00:00:26.000000000 +0100
+++ vlc-0.8.5-20060226/modules/misc/network/ipv4.c      2006-02-28 11:41:42.539457000 +0100
@@ -410,7 +410,7 @@
                 return 0;
             }
          }
-    }
+    } else
 #endif
 
     if( *psz_server_addr )
diff -Naur vlc-0.8.5-20060226.orig/modules/misc/network/ipv6.c vlc-0.8.5-20060226/modules/misc/network/ipv6.c
--- vlc-0.8.5-20060226.orig/modules/misc/network/ipv6.c 2006-02-26 00:00:26.000000000 +0100
+++ vlc-0.8.5-20060226/modules/misc/network/ipv6.c      2006-02-28 11:33:54.590910000 +0100
@@ -302,9 +302,7 @@
                 msg_Err( p_this, "cannot join multicast group" );
             } 
         }
-    }
-
-    if( *psz_server_addr )
+    } else if( *psz_server_addr )
     {
         int ttl;
 

-- 
This is the vlc-devel mailing-list, see http://www.videolan.org/vlc/
To unsubscribe, please read http://developers.videolan.org/lists.html



More information about the vlc-devel mailing list