]> git.sesse.net Git - vlc/commitdiff
Pick IPv6 scope ID from group address, instead of source address
authorRémi Denis-Courmont <rem@videolan.org>
Sun, 26 Nov 2006 22:29:33 +0000 (22:29 +0000)
committerRémi Denis-Courmont <rem@videolan.org>
Sun, 26 Nov 2006 22:29:33 +0000 (22:29 +0000)
Fix possible segfault as a side-effect

src/network/udp.c

index bcf4815d4b4fc2a1deedb1e869ef0f89a804e794..cc71ac0f3759f4aa1049cabc08c13ccb56174e1b 100644 (file)
@@ -351,22 +351,13 @@ net_SourceSubscribe (vlc_object_t *obj, int fd,
 #ifdef AF_INET6
         case AF_INET6:
             level = SOL_IPV6;
-            if ((src != NULL)
-             && memcmp (&((const struct sockaddr_in6 *)src)->sin6_addr,
-                        &in6addr_any, sizeof (in6addr_any)) == 0)
-                src = NULL;
-
-            if (((const struct sockaddr_in6 *)src)->sin6_scope_id)
-                iid = ((const struct sockaddr_in6 *)src)->sin6_scope_id;
+            if (((const struct sockaddr_in6 *)grp)->sin6_scope_id)
+                iid = ((const struct sockaddr_in6 *)grp)->sin6_scope_id;
             break;
 #endif
 
         case AF_INET:
             level = SOL_IP;
-            if ((src != NULL)
-             && ((const struct sockaddr_in *)src)->sin_addr.s_addr
-                  == INADDR_ANY)
-                src = NULL;
             break;
 
         default:
@@ -374,6 +365,25 @@ net_SourceSubscribe (vlc_object_t *obj, int fd,
             return -1;
     }
 
+    if (src != NULL)
+        switch (src->sa_family)
+        {
+#ifdef AF_INET6
+            case AF_INET6:
+                if (memcmp (&((const struct sockaddr_in6 *)src)->sin6_addr,
+                            &in6addr_any, sizeof (in6addr_any)) == 0)
+                    src = NULL;
+            break;
+#endif
+
+            case AF_INET:
+                if (((const struct sockaddr_in *)src)->sin_addr.s_addr
+                     == INADDR_ANY)
+                    src = NULL;
+                break;
+        }
+
+
     /* Agnostic ASM/SSM multicast join */
 #ifdef MCAST_JOIN_SOURCE_GROUP
     union