[vlc-commits] [Git][videolan/vlc][master] 14 commits: vlc_network: add a union to avoid mixing sockaddr pointers

Steve Lhomme (@robUx4) gitlab at videolan.org
Fri Jan 24 05:54:45 UTC 2025



Steve Lhomme pushed to branch master at VideoLAN / VLC


Commits:
2e97000a by Steve Lhomme at 2025-01-24T05:39:47+00:00
vlc_network: add a union to avoid mixing sockaddr pointers

Similar to the one from 5c62c801edea6c4ef695668831ec4252d78166de.

- - - - -
4af56b19 by Steve Lhomme at 2025-01-24T05:39:47+00:00
vlc_network: use vlc_sockaddr for net_GetXXXAddress()

- - - - -
91a7601f by Steve Lhomme at 2025-01-24T05:39:47+00:00
udp: use vlc_sockaddr instead of local equivalent

- - - - -
100d9852 by Steve Lhomme at 2025-01-24T05:39:47+00:00
tunnel_test: use vlc_sockaddr to read addresses

- - - - -
48b62caa by Steve Lhomme at 2025-01-24T05:39:47+00:00
amt: remove unnecessary cast

- - - - -
9826042a by Steve Lhomme at 2025-01-24T05:39:47+00:00
amt: replace duplicate variables by a single vlc_sockaddr

- - - - -
875fa7c3 by Steve Lhomme at 2025-01-24T05:39:47+00:00
sout/udp: use vlc_sockaddr to read addresses

- - - - -
521c782e by Steve Lhomme at 2025-01-24T05:39:47+00:00
sout/rtp: use vlc_sockaddr to read addresses

- - - - -
16f953de by Steve Lhomme at 2025-01-24T05:39:47+00:00
netsync: use vlc_sockaddr to read addresses

- - - - -
75e62753 by Steve Lhomme at 2025-01-24T05:39:47+00:00
smb2: use vlc_sockaddr to read addresses

- - - - -
433b8bd6 by Steve Lhomme at 2025-01-24T05:39:47+00:00
sap: use vlc_sockaddr to read addresses

Instead of local equivalent.

- - - - -
2096955e by Steve Lhomme at 2025-01-24T05:39:47+00:00
os2/getaddrinfo: use vlc_sockaddr

- - - - -
f785073f by Steve Lhomme at 2025-01-24T05:39:47+00:00
bonjour: use vlc_sockaddr to read addresses

Instead of local equivalent.

- - - - -
6d827302 by Steve Lhomme at 2025-01-24T05:39:47+00:00
udp: use vlc_sockaddr instead of local variant

- - - - -


11 changed files:

- include/vlc_network.h
- modules/access/amt.c
- modules/access/http/tunnel_test.c
- modules/access/smb2.c
- modules/control/netsync.c
- modules/services_discovery/bonjour.m
- modules/stream_out/rtp.c
- modules/stream_out/udp.c
- src/network/udp.c
- src/os2/getaddrinfo.c
- src/stream_output/sap.c


Changes:

=====================================
include/vlc_network.h
=====================================
@@ -292,6 +292,16 @@ static inline int vlc_setsockopt(int s, int level, int name,
 # endif
 #endif
 
+/* union of the various sockaddr structures often used together */
+typedef union {
+    struct sockaddr         sa;
+    struct sockaddr_storage ss;
+    struct sockaddr_in      sin;
+#ifdef AF_INET6
+    struct sockaddr_in6     sin6;
+#endif
+} vlc_sockaddr;
+
 VLC_API int vlc_getnameinfo( const struct sockaddr *, int, char *, int, int *, int );
 
 /**
@@ -343,22 +353,22 @@ net_SockAddrIsMulticast (const struct sockaddr *addr, socklen_t len)
 
 static inline int net_GetSockAddress( int fd, char *address, int *port )
 {
-    struct sockaddr_storage addr;
-    socklen_t addrlen = sizeof( addr );
+    vlc_sockaddr addr;
+    socklen_t addrlen = sizeof( addr.ss );
 
-    return getsockname( fd, (struct sockaddr *)&addr, &addrlen )
-        || vlc_getnameinfo( (struct sockaddr *)&addr, addrlen, address,
+    return getsockname( fd, &addr.sa, &addrlen )
+        || vlc_getnameinfo( &addr.sa, addrlen, address,
                             NI_MAXNUMERICHOST, port, NI_NUMERICHOST )
         ? VLC_EGENERIC : 0;
 }
 
 static inline int net_GetPeerAddress( int fd, char *address, int *port )
 {
-    struct sockaddr_storage addr;
-    socklen_t addrlen = sizeof( addr );
+    vlc_sockaddr addr;
+    socklen_t addrlen = sizeof( addr.ss );
 
-    return getpeername( fd, (struct sockaddr *)&addr, &addrlen )
-        || vlc_getnameinfo( (struct sockaddr *)&addr, addrlen, address,
+    return getpeername( fd, &addr.sa, &addrlen )
+        || vlc_getnameinfo( &addr.sa, addrlen, address,
                             NI_MAXNUMERICHOST, port, NI_NUMERICHOST )
         ? VLC_EGENERIC : 0;
 }


=====================================
modules/access/amt.c
=====================================
@@ -293,19 +293,10 @@ typedef struct _access_sys_t
     vlc_timer_t updateTimer;
 
     /* Mulicast group and source, differentiate between address family based on the sa_family which is the first field (sin_family or sin6_family) in both structs */
-    union {
-        struct sockaddr_in ipv4;
-        struct sockaddr_in6 ipv6;
-    } mcastGroupAddr;
-    union {
-        struct sockaddr_in ipv4;
-        struct sockaddr_in6 ipv6;
-    } mcastSrcAddr;
+    vlc_sockaddr mcastGroupAddr;
+    vlc_sockaddr mcastSrcAddr;
     /* AMT relay imformation */
-    union {
-        struct sockaddr_in ipv4;
-        struct sockaddr_in6 ipv6;
-    } relayDiscoAddr;
+    vlc_sockaddr relayDiscoAddr;
 
     /* AMT Relay Membership Query data (RFC7450) */
     struct relay_mem_query_msg_t {
@@ -477,12 +468,12 @@ static int Open( vlc_object_t *p_this )
     /* Store the binary socket representation of multicast group address */
     if ( serverinfo->ai_family == AF_INET )
     {
-        sys->mcastGroupAddr.ipv4 = *(struct sockaddr_in*)serverinfo->ai_addr;
+        sys->mcastGroupAddr.sin = *(struct sockaddr_in*)serverinfo->ai_addr;
         hints.ai_family = AF_INET; /* now that we know family of the group we can improve the hints for resolving the source */
     }
     else
     {
-        sys->mcastGroupAddr.ipv6 = *(struct sockaddr_in6*)serverinfo->ai_addr;
+        sys->mcastGroupAddr.sin6 = *(struct sockaddr_in6*)serverinfo->ai_addr;
         hints.ai_family = AF_INET6;
     }
     /* Release the allocated memory */
@@ -546,9 +537,9 @@ static int Open( vlc_object_t *p_this )
         /* Store the binary socket representation of multicast source address */
         if ( serverinfo->ai_family == AF_INET )
         {
-            sys->mcastSrcAddr.ipv4 = *(struct sockaddr_in*)serverinfo->ai_addr;
+            sys->mcastSrcAddr.sin = *(struct sockaddr_in*)serverinfo->ai_addr;
         } else {
-            sys->mcastSrcAddr.ipv6 = *(struct sockaddr_in6*)serverinfo->ai_addr;
+            sys->mcastSrcAddr.sin6 = *(struct sockaddr_in6*)serverinfo->ai_addr;
         }
         msg_Dbg( p_access, "Setting multicast source address to %s", mcastSrc);
     }
@@ -665,7 +656,7 @@ static block_t *BlockAMT(stream_t *p_access, bool *restrict eof)
 {
     access_sys_t *sys = p_access->p_sys;
     ssize_t len = 0, shift = 0;
-    int tunnel = UDP_HDR_LEN + AMT_HDR_LEN + (sys->mcastGroupAddr.ipv4.sin_family == AF_INET ? IP_HDR_LEN : IPv6_FIXED_HDR_LEN );
+    int tunnel = UDP_HDR_LEN + AMT_HDR_LEN + (sys->mcastGroupAddr.sin.sin_family == AF_INET ? IP_HDR_LEN : IPv6_FIXED_HDR_LEN );
 
     /* Allocate anticipated MTU buffer for holding the UDP packet suitable for native or AMT tunneled multicast */
     block_t *pkt = block_Alloc( sys->mtu + tunnel );
@@ -821,7 +812,7 @@ static block_t *BlockAMT(stream_t *p_access, bool *restrict eof)
     /* Otherwise pull native multicast */
         struct sockaddr temp;
         socklen_t temp_size = sizeof( struct sockaddr );
-        len = recvfrom( sys->fd, (char *)pkt->p_buffer, sys->mtu + tunnel, 0, (struct sockaddr*)&temp, &temp_size );
+        len = recvfrom( sys->fd, (char *)pkt->p_buffer, sys->mtu + tunnel, 0, &temp, &temp_size );
         if ( len <= 0 )
         {
             msg_Err(p_access, "recv() call failed: %zd was returned", len);
@@ -894,9 +885,9 @@ static bool open_amt_tunnel( stream_t *p_access )
         /* Store the binary representation */
         if ( server->ai_family == AF_INET )
         {
-            sys->relayDiscoAddr.ipv4 = *(struct sockaddr_in*)server_addr;
+            sys->relayDiscoAddr.sin = *(struct sockaddr_in*)server_addr;
         } else {
-            sys->relayDiscoAddr.ipv6 = *(struct sockaddr_in6*)server_addr;
+            sys->relayDiscoAddr.sin6 = *(struct sockaddr_in6*)server_addr;
         }
 
         if( amt_sockets_init( p_access ) != 0 )
@@ -942,8 +933,8 @@ static bool open_amt_tunnel( stream_t *p_access )
 
             /* Arm IGMP timer once we've confirmed we are getting packets */
             vlc_timer_schedule( sys->updateTimer, false,
-                        VLC_TICK_FROM_SEC( sys->relayDiscoAddr.ipv4.sin_family == AF_INET ? sys->relay_query.igmp.qqic : sys->relay_query.mld.qqic), 0 );
-            msg_Err(p_access, "Arming timer. qqic is %d",sys->relayDiscoAddr.ipv4.sin_family == AF_INET ? sys->relay_query.igmp.qqic : sys->relay_query.mld.qqic);
+                        VLC_TICK_FROM_SEC( sys->relayDiscoAddr.sin.sin_family == AF_INET ? sys->relay_query.igmp.qqic : sys->relay_query.mld.qqic), 0 );
+            msg_Err(p_access, "Arming timer. qqic is %d",sys->relayDiscoAddr.sin.sin_family == AF_INET ? sys->relay_query.igmp.qqic : sys->relay_query.mld.qqic);
 
             break;   /* found an active server sending UDP packets, so exit loop */
         }
@@ -1132,16 +1123,12 @@ static void make_ipv6( amt_ipv6_t *p, uint16_t length, struct in6_addr *dst )
  */
 static int amt_sockets_init( stream_t *p_access )
 {
-    struct sockaddr *rcvAddr;
-    struct sockaddr_in rcvAddr4;
-    struct sockaddr_in6 rcvAddr6;
+    vlc_sockaddr rcvAddr = {0};
     access_sys_t *sys = p_access->p_sys;
-    memset( &rcvAddr4, 0, sizeof(struct sockaddr_in) );
-    memset( &rcvAddr6, 0, sizeof(struct sockaddr_in6) );
     int enable = 0, res = 0;
 
     /* create UDP socket */
-    sys->sAMT = vlc_socket( sys->relayDiscoAddr.ipv4.sin_family, SOCK_DGRAM, IPPROTO_UDP, true );
+    sys->sAMT = vlc_socket( sys->relayDiscoAddr.sin.sin_family, SOCK_DGRAM, IPPROTO_UDP, true );
     if( sys->sAMT == -1 )
     {
         msg_Err( p_access, "Failed to create UDP socket" );
@@ -1155,23 +1142,29 @@ static int amt_sockets_init( stream_t *p_access )
         goto error;
     }
 
-    rcvAddr4.sin_family      = AF_INET;
-    rcvAddr4.sin_port        = htons( 0 );
-    rcvAddr4.sin_addr.s_addr = INADDR_ANY;
-
-    rcvAddr6.sin6_family      = AF_INET6;
-    rcvAddr6.sin6_port        = htons( 0 );
-    rcvAddr6.sin6_addr = (struct in6_addr) IN6ADDR_ANY_INIT;
-
-    rcvAddr = sys->relayDiscoAddr.ipv4.sin_family == AF_INET ? (struct sockaddr*) &rcvAddr4 : (struct sockaddr*) &rcvAddr6;
+    socklen_t rcvNamelen;
+    if (sys->relayDiscoAddr.sin.sin_family == AF_INET)
+    {
+        rcvNamelen                  = sizeof(rcvAddr.sin);
+        rcvAddr.sin.sin_family      = AF_INET;
+        rcvAddr.sin.sin_port        = htons( 0 );
+        rcvAddr.sin.sin_addr.s_addr = INADDR_ANY;
+    }
+    else
+    {
+        rcvNamelen                  = sizeof(rcvAddr.sin6);
+        rcvAddr.sin6.sin6_family    = AF_INET6;
+        rcvAddr.sin6.sin6_port      = htons( 0 );
+        rcvAddr.sin6.sin6_addr      = (struct in6_addr) IN6ADDR_ANY_INIT;
+    }
 
-    if( bind(sys->sAMT, rcvAddr, sys->relayDiscoAddr.ipv4.sin_family == AF_INET ? sizeof(rcvAddr4) : sizeof(rcvAddr6) ) != 0 )
+    if( bind(sys->sAMT, &rcvAddr.sa, rcvNamelen ) != 0 )
     {
         msg_Err( p_access, "Failed to bind UDP socket error: %s", vlc_strerror(errno) );
         goto error;
     }
 
-    sys->sQuery = vlc_socket( sys->relayDiscoAddr.ipv4.sin_family, SOCK_DGRAM, IPPROTO_UDP, true );
+    sys->sQuery = vlc_socket( sys->relayDiscoAddr.sin.sin_family, SOCK_DGRAM, IPPROTO_UDP, true );
     if( sys->sQuery == -1 )
     {
         msg_Err( p_access, "Failed to create query socket" );
@@ -1179,22 +1172,24 @@ static int amt_sockets_init( stream_t *p_access )
     }
 
     /* bind socket to local address */
-    struct sockaddr_in stLocalAddr4 =
+    vlc_sockaddr stLocalAddr = {0};
+    socklen_t stLocalNamelen;
+    if (sys->relayDiscoAddr.sin.sin_family == AF_INET)
     {
-        .sin_family      = AF_INET,
-        .sin_port        = htons( 0 ),
-        .sin_addr.s_addr = INADDR_ANY,
-    };
-
-    struct sockaddr_in6 stLocalAddr6;
-    memset( &rcvAddr6, 0, sizeof(struct sockaddr_in6) );
-    stLocalAddr6.sin6_family = AF_INET6;
-    stLocalAddr6.sin6_port = htons( 0 );
-    stLocalAddr6.sin6_addr = (struct in6_addr) IN6ADDR_ANY_INIT;
-
-    struct sockaddr *stLocalAddr = sys->relayDiscoAddr.ipv4.sin_family == AF_INET ? (struct sockaddr*) &stLocalAddr4 : (struct sockaddr*) &stLocalAddr6;
+        stLocalNamelen                  = sizeof(stLocalAddr.sin);
+        stLocalAddr.sin.sin_family      = AF_INET;
+        stLocalAddr.sin.sin_port        = htons( 0 );
+        stLocalAddr.sin.sin_addr.s_addr = INADDR_ANY;
+    }
+    else
+    {
+        stLocalNamelen               = sizeof(stLocalAddr.sin6);
+        stLocalAddr.sin6.sin6_family = AF_INET6;
+        stLocalAddr.sin6.sin6_port   = htons( 0 );
+        stLocalAddr.sin6.sin6_addr   = (struct in6_addr) IN6ADDR_ANY_INIT;
+    }
 
-    if( bind(sys->sQuery, stLocalAddr, sys->relayDiscoAddr.ipv4.sin_family == AF_INET ? sizeof(stLocalAddr4) : sizeof(stLocalAddr6) ) != 0 )
+    if( bind(sys->sQuery, &stLocalAddr.sa, stLocalNamelen ) != 0 )
     {
         msg_Err( p_access, "Failed to bind query socket" );
         goto error;
@@ -1250,7 +1245,7 @@ static void amt_send_relay_discovery_msg( stream_t *p_access, char *relay_ip )
     sys->glob_ulNonce = ulNonce;
 
     /* send it */
-    nRet = sendto( sys->sAMT, chaSendBuffer, sizeof(chaSendBuffer), 0, (struct sockaddr*) &sys->relayDiscoAddr, sys->relayDiscoAddr.ipv4.sin_family == AF_INET ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6));
+    nRet = sendto( sys->sAMT, chaSendBuffer, sizeof(chaSendBuffer), 0, &sys->relayDiscoAddr.sa, sys->relayDiscoAddr.sin.sin_family == AF_INET ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6));
 
     if( nRet < 0)
     {
@@ -1296,7 +1291,7 @@ static void amt_send_relay_request( stream_t *p_access, char *relay_ip )
      */
 
     chaSendBuffer[0] = AMT_REQUEST;
-    chaSendBuffer[1] = sys->mcastGroupAddr.ipv4.sin_family == AF_INET6;
+    chaSendBuffer[1] = sys->mcastGroupAddr.sin.sin_family == AF_INET6;
     chaSendBuffer[2] = 0;
     chaSendBuffer[3] = 0;
 
@@ -1421,7 +1416,7 @@ static int amt_send_mem_update( stream_t *p_access, bool leave)
     ulNonce = sys->glob_ulNonce;
     memcpy( &pSendBuffer[8], &ulNonce, NONCE_LEN );
 
-    if ( sys->mcastGroupAddr.ipv4.sin_family == AF_INET )
+    if ( sys->mcastGroupAddr.sin.sin_family == AF_INET )
     {
         /* make IP header for IGMP packet */
         amt_ip_alert_t p_ipHead;
@@ -1440,13 +1435,13 @@ static int amt_send_mem_update( stream_t *p_access, bool leave)
 
         amt_igmpv3_groupRecord_t groupRcd;
         groupRcd.auxDatalen = 0;
-        groupRcd.ssm = sys->mcastGroupAddr.ipv4.sin_addr.s_addr;
+        groupRcd.ssm = sys->mcastGroupAddr.sin.sin_addr.s_addr;
 
-        if( sys->mcastSrcAddr.ipv4.sin_addr.s_addr )
+        if( sys->mcastSrcAddr.sin.sin_addr.s_addr )
         {
             groupRcd.type = leave ? AMT_IGMP_BLOCK:AMT_IGMP_INCLUDE;
             groupRcd.nSrc = htons(1);
-            groupRcd.srcIP[0] = sys->mcastSrcAddr.ipv4.sin_addr.s_addr;
+            groupRcd.srcIP[0] = sys->mcastSrcAddr.sin.sin_addr.s_addr;
 
         }
         else
@@ -1487,7 +1482,7 @@ static int amt_send_mem_update( stream_t *p_access, bool leave)
 
         make_ipv6(&ip, IPv6_HOP_BY_HOP_OPTION_LEN + MLD_REPORT_LEN, &tmp);
 
-        if( make_mld_report(p_access,leave,&report,&sys->mcastGroupAddr.ipv6.sin6_addr,&sys->mcastSrcAddr.ipv6.sin6_addr) )
+        if( make_mld_report(p_access,leave,&report,&sys->mcastGroupAddr.sin6.sin6_addr,&sys->mcastSrcAddr.sin6.sin6_addr) )
         {
             goto oom;
         }
@@ -1581,18 +1576,27 @@ static bool amt_rcv_relay_adv( stream_t *p_access )
         return false;
     }
 
-    struct sockaddr_in relayAddr4;
-    relayAddr4.sin_port = htons( AMT_PORT );
-    relayAddr4.sin_family = AF_INET;
-
-    struct sockaddr_in6 relayAddr6;
-    relayAddr6.sin6_port = htons( AMT_PORT );
-    relayAddr6.sin6_family = AF_INET6;
+    vlc_sockaddr relayAddr = {0};
+    socklen_t relayNamelen;
+    void *bin_address_start;
+    if (sys->relayDiscoAddr.sin.sin_family == AF_INET)
+    {
+        relayNamelen               = sizeof(relayAddr.sin);
+        bin_address_start          = &relayAddr.sin.sin_addr;
+        relayAddr.sin.sin_port     = htons( AMT_PORT );
+        relayAddr.sin.sin_family   = AF_INET;
+    }
+    else
+    {
+        relayNamelen               = sizeof(relayAddr.sin6);
+        bin_address_start          = &relayAddr.sin6.sin6_addr;
+        relayAddr.sin6.sin6_port   = htons( AMT_PORT );
+        relayAddr.sin6.sin6_family = AF_INET6;
+    }
 
-    void *bin_address_start = (sys->relayDiscoAddr.ipv4.sin_family == AF_INET) ? (void*) &relayAddr4.sin_addr : (void*) &relayAddr6.sin6_addr;
-    memcpy( bin_address_start , &pkt[8], sys->relayDiscoAddr.ipv4.sin_family == AF_INET ? 4 : 16);
+    memcpy( bin_address_start , &pkt[8], sys->relayDiscoAddr.sin.sin_family == AF_INET ? 4 : 16);
 
-    int nRet = connect( sys->sAMT, sys->relayDiscoAddr.ipv4.sin_family == AF_INET ? (struct sockaddr*)&relayAddr4 : (struct sockaddr*)&relayAddr6, sys->relayDiscoAddr.ipv4.sin_family == AF_INET ? sizeof(relayAddr4) : sizeof(relayAddr6) );
+    int nRet = connect( sys->sAMT, &relayAddr.sa, relayNamelen );
     if( nRet < 0 )
     {
         msg_Err( p_access, "Error connecting AMT UDP socket: %s", vlc_strerror(errno) );
@@ -1649,7 +1653,7 @@ static bool amt_rcv_relay_mem_query( stream_t *p_access )
 
     ssize_t len = recv( sys->sAMT, pkt, i_buf_len, 0 );
 
-    if ( len <= 0 || (sys->mcastGroupAddr.ipv4.sin_family == AF_INET && len != (RELAY_QUERY_MSG_LEN - 40)) || (sys->mcastGroupAddr.ipv4.sin_family == AF_INET6 && len < RELAY_QUERY_MSG_LEN) ) /* subtract 40 for ipv4 case */
+    if ( len <= 0 || (sys->mcastGroupAddr.sin.sin_family == AF_INET && len != (RELAY_QUERY_MSG_LEN - 40)) || (sys->mcastGroupAddr.sin.sin_family == AF_INET6 && len < RELAY_QUERY_MSG_LEN) ) /* subtract 40 for ipv4 case */
     {
         msg_Err(p_access, "length of relay query message invalid!");
         return false;
@@ -1665,7 +1669,7 @@ static bool amt_rcv_relay_mem_query( stream_t *p_access )
         return false;
     }
 
-    if ( sys->mcastGroupAddr.ipv4.sin_family == AF_INET )
+    if ( sys->mcastGroupAddr.sin.sin_family == AF_INET )
     {
         size_t shift = AMT_HDR_LEN + MAC_LEN + NONCE_LEN + IP_HDR_IGMP_LEN;
         sys->relay_query.igmp.type = pkt[shift];
@@ -1754,5 +1758,5 @@ static void amt_update_timer_cb( void *data )
     /* Arms the timer again for a single shot from this callback. That way, the
      * time spent in amt_send_mem_update() is taken into consideration. */
     vlc_timer_schedule( sys->updateTimer, false,
-                        VLC_TICK_FROM_SEC( sys->mcastGroupAddr.ipv4.sin_family == AF_INET ? sys->relay_query.igmp.qqic : sys->relay_query.mld.qqic), 0 );
+                        VLC_TICK_FROM_SEC( sys->mcastGroupAddr.sin.sin_family == AF_INET ? sys->relay_query.igmp.qqic : sys->relay_query.mld.qqic), 0 );
 }


=====================================
modules/access/http/tunnel_test.c
=====================================
@@ -122,23 +122,23 @@ static int server_socket(unsigned *port)
     if (fd == -1)
         return -1;
 
-    struct sockaddr_in6 addr = {
-        .sin6_family = AF_INET6,
+    vlc_sockaddr addr = {
+        .sin6.sin6_family = AF_INET6,
 #ifdef HAVE_SA_LEN
-        .sin6_len = sizeof (addr),
+        .sin6.sin6_len = sizeof (addr),
 #endif
-        .sin6_addr = in6addr_loopback,
+        .sin6.sin6_addr = in6addr_loopback,
     };
-    socklen_t addrlen = sizeof (addr);
+    socklen_t addrlen = sizeof (addr.sin6);
 
-    if (bind(fd, (struct sockaddr *)&addr, addrlen)
-     || getsockname(fd, (struct sockaddr *)&addr, &addrlen))
+    if (bind(fd, &addr.sa, addrlen)
+     || getsockname(fd, &addr.sa, &addrlen))
     {
         vlc_close(fd);
         return -1;
     }
 
-    *port = ntohs(addr.sin6_port);
+    *port = ntohs(addr.sin6.sin6_port);
     return fd;
 }
 


=====================================
modules/access/smb2.c
=====================================
@@ -551,25 +551,25 @@ vlc_smb2_print_addr(stream_t *access)
 {
     struct access_sys *sys = access->p_sys;
 
-    struct sockaddr_storage addr;
-    if (getsockname(smb2_get_fd(sys->smb2), (struct sockaddr *)&addr,
-                    &(socklen_t){ sizeof(addr) }) != 0)
+    vlc_sockaddr addr;
+    if (getsockname(smb2_get_fd(sys->smb2), &addr.sa,
+                    &(socklen_t){ sizeof(addr.ss) }) != 0)
         return;
 
-    void *sin_addr;
-    switch (addr.ss_family)
+    const void *sin_addr;
+    switch (addr.ss.ss_family)
     {
         case AF_INET6:
-            sin_addr = &((struct sockaddr_in6 *)&addr)->sin6_addr;
+            sin_addr = &addr.sin6.sin6_addr;
             break;
         case AF_INET:
-            sin_addr = &((struct sockaddr_in *)&addr)->sin_addr;
+            sin_addr = &addr.sin.sin_addr;
             break;
         default:
             return;
     }
     char ip[INET6_ADDRSTRLEN];
-    if (inet_ntop(addr.ss_family, sin_addr, ip, sizeof(ip)) == NULL)
+    if (inet_ntop(addr.ss.ss_family, sin_addr, ip, sizeof(ip)) == NULL)
         return;
 
     if (strcmp(ip, sys->encoded_url.psz_host) == 0)


=====================================
modules/control/netsync.c
=====================================
@@ -202,11 +202,10 @@ static void *Master(void *handle)
             continue;
 
         /* We received something */
-        struct sockaddr_storage from;
-        socklen_t fromlen = sizeof (from);
+        vlc_sockaddr from;
+        socklen_t fromlen = sizeof (from.ss);
 
-        if (recvfrom(sys->fd, data, 8, 0,
-                     (struct sockaddr *)&from, &fromlen) < 8)
+        if (recvfrom(sys->fd, data, 8, 0, &from.sa, &fromlen) < 8)
             continue;
 
         vlc_tick_t master_system = GetPcrSystem(sys->input);
@@ -217,8 +216,7 @@ static void *Master(void *handle)
         data[1] = hton64(master_system);
 
         /* Reply to the sender */
-        sendto(sys->fd, data, 16, 0,
-               (struct sockaddr *)&from, fromlen);
+        sendto(sys->fd, data, 16, 0, &from.sa, fromlen);
 #if 0
         /* not sure we need the client information to sync,
            since we are the master anyway */


=====================================
modules/services_discovery/bonjour.m
=====================================
@@ -30,6 +30,7 @@
 #include <vlc_modules.h>
 #include <vlc_services_discovery.h>
 #include <vlc_renderer_discovery.h>
+#include <vlc_network.h>
 
 #import <Foundation/Foundation.h>
 #import <arpa/inet.h>
@@ -130,24 +131,18 @@ static NSString * ipAddressAsStringForData(NSData * data)
         return returnValue;
     }
 
-    typedef union {
-        struct sockaddr sa;
-        struct sockaddr_in ipv4;
-        struct sockaddr_in6 ipv6;
-    } ip_socket_address;
-
-    ip_socket_address *socketAddress = (ip_socket_address *)[data bytes];
+    const vlc_sockaddr *socketAddress = (const vlc_sockaddr *)[data bytes];
 
     if (socketAddress) {
         const char *addressStr = NULL;
         if (socketAddress->sa.sa_family == AF_INET) {
             addressStr = inet_ntop(socketAddress->sa.sa_family,
-                                           (void *)&(socketAddress->ipv4.sin_addr),
+                                           &(socketAddress->sin.sin_addr),
                                            addressBuffer,
                                            sizeof(addressBuffer));
         } else if (socketAddress->sa.sa_family == AF_INET6) {
             addressStr = inet_ntop(socketAddress->sa.sa_family,
-                                           (void *)&(socketAddress->ipv6.sin6_addr),
+                                           &(socketAddress->sin6.sin6_addr),
                                            addressBuffer,
                                            sizeof(addressBuffer));
         }


=====================================
modules/stream_out/rtp.c
=====================================
@@ -733,7 +733,7 @@ char *SDPGenerate( sout_stream_t *p_stream, const char *rtsp_url )
 {
     sout_stream_sys_t *p_sys = p_stream->p_sys;
     struct vlc_memstream sdp;
-    struct sockaddr_storage dst;
+    vlc_sockaddr dst;
     char *psz_sdp = NULL;
     socklen_t dstlen;
     int i;
@@ -763,13 +763,11 @@ char *SDPGenerate( sout_stream_t *p_stream, const char *rtsp_url )
         inclport = true;
 
         /* Oh boy, this is really ugly! */
-        dstlen = sizeof( dst );
+        dstlen = sizeof( dst.ss );
         if( p_sys->es[0]->listen.fd != NULL )
-            getsockname( p_sys->es[0]->listen.fd[0],
-                         (struct sockaddr *)&dst, &dstlen );
+            getsockname( p_sys->es[0]->listen.fd[0], &dst.sa, &dstlen );
         else
-            getpeername( p_sys->es[0]->sinkv[0].rtp_fd,
-                         (struct sockaddr *)&dst, &dstlen );
+            getpeername( p_sys->es[0]->sinkv[0].rtp_fd, &dst.sa, &dstlen );
     }
     else
     {
@@ -783,14 +781,14 @@ char *SDPGenerate( sout_stream_t *p_stream, const char *rtsp_url )
         dstlen = ipv6 ? sizeof( struct sockaddr_in6 )
                       : sizeof( struct sockaddr_in );
         memset (&dst, 0, dstlen);
-        dst.ss_family = ipv6 ? AF_INET6 : AF_INET;
+        dst.ss.ss_family = ipv6 ? AF_INET6 : AF_INET;
 #ifdef HAVE_SA_LEN
-        dst.ss_len = dstlen;
+        dst.ss.ss_len = dstlen;
 #endif
     }
 
     if( vlc_sdp_Start( &sdp, VLC_OBJECT( p_stream ), SOUT_CFG_PREFIX,
-                       NULL, 0, (struct sockaddr *)&dst, dstlen ) )
+                       NULL, 0, &dst.sa, dstlen ) )
         goto out;
 
     /* TODO: a=source-filter */


=====================================
modules/stream_out/udp.c
=====================================
@@ -83,31 +83,27 @@ static void Flush(sout_stream_t *stream, void *id)
 
 static session_descriptor_t *CreateSDP(vlc_object_t *obj, int fd)
 {
-    union {
-        struct sockaddr addr;
-        struct sockaddr_in in;
-        struct sockaddr_in6 in6;
-    } src, dst;
+    vlc_sockaddr src, dst;
     socklen_t srclen = sizeof (srclen), dstlen = sizeof (dst);
     char dhost[INET6_ADDRSTRLEN];
     unsigned short dport;
 
-    if (getsockname(fd, &src.addr, &srclen)
-     || getpeername(fd, &dst.addr, &dstlen)) {
+    if (getsockname(fd, &src.sa, &srclen)
+     || getpeername(fd, &dst.sa, &dstlen)) {
         int val = errno;
 
         msg_Err(obj, "cannot format SDP: %s", vlc_strerror_c(val));
         return NULL;
     }
 
-    switch (dst.addr.sa_family) {
+    switch (dst.sa.sa_family) {
         case AF_INET:
-            inet_ntop(AF_INET, &dst.in.sin_addr, dhost, sizeof (dhost));
-            dport = dst.in.sin_port;
+            inet_ntop(AF_INET, &dst.sin.sin_addr, dhost, sizeof (dhost));
+            dport = dst.sin.sin_port;
             break;
         case AF_INET6:
-            inet_ntop(AF_INET6, &dst.in6.sin6_addr, dhost, sizeof (dhost));
-            dport = dst.in6.sin6_port;
+            inet_ntop(AF_INET6, &dst.sin6.sin6_addr, dhost, sizeof (dhost));
+            dport = dst.sin6.sin6_port;
             break;
         default:
             return NULL;
@@ -116,7 +112,7 @@ static session_descriptor_t *CreateSDP(vlc_object_t *obj, int fd)
     struct vlc_memstream sdp;
 
     if (vlc_sdp_Start(&sdp, obj, SOUT_CFG_PREFIX,
-                      &src.addr, srclen, &dst.addr, dstlen))
+                      &src.sa, srclen, &dst.sa, dstlen))
         return NULL;
 
     vlc_memstream_printf(&sdp, "m=video %d udp mpeg\r\n", ntohs(dport));


=====================================
src/network/udp.c
=====================================
@@ -118,21 +118,16 @@ static int net_SetupDgramSocket (vlc_object_t *p_obj, int fd,
 
     if (net_SockAddrIsMulticast (ptr->ai_addr, ptr->ai_addrlen))
     {
-        union
-        {
-            struct sockaddr a;
-            struct sockaddr_in in;
-            struct sockaddr_in6 in6;
-        } dumb = {
+        vlc_sockaddr dumb = {
             { .sa_family = ptr->ai_addr->sa_family, },
         };
 
         static_assert (offsetof (struct sockaddr_in, sin_port) ==
                        offsetof (struct sockaddr_in6, sin6_port), "Mismatch");
         assert(ptr->ai_addrlen <= sizeof (dumb));
-        memcpy(&dumb.in6.sin6_port, ((unsigned char *)ptr->ai_addr)
+        memcpy(&dumb.sin6.sin6_port, ((unsigned char *)ptr->ai_addr)
                                + offsetof (struct sockaddr_in, sin_port), 2);
-        bind(fd, &dumb.a, ptr->ai_addrlen);
+        bind(fd, &dumb.sa, ptr->ai_addrlen);
     }
     else
 #endif
@@ -502,20 +497,14 @@ static int net_Subscribe(vlc_object_t *obj, int fd,
 
 static int net_SetDSCP( int fd, uint8_t dscp )
 {
-    union {
-        struct sockaddr a;
-        struct sockaddr_in in;
-#ifdef IPV6_TCLASS
-        struct sockaddr_in in6;
-#endif
-    } addr;
+    vlc_sockaddr addr;
 
-    if (getsockname(fd, &addr.a, &(socklen_t){ sizeof (addr) }))
+    if (getsockname(fd, &addr.sa, &(socklen_t){ sizeof (addr) }))
         return -1;
 
     int level, cmd;
 
-    switch (addr.a.sa_family)
+    switch (addr.sa.sa_family)
     {
 #ifdef IPV6_TCLASS
         case AF_INET6:


=====================================
src/os2/getaddrinfo.c
=====================================
@@ -160,18 +160,17 @@ makeaddrinfo (int af, int type, int proto,
 static struct addrinfo *
 makeipv4info (int type, int proto, u_long ip, u_short port, const char *name)
 {
-    struct sockaddr_in addr;
+    vlc_sockaddr addr = {0};
 
-    memset (&addr, 0, sizeof (addr));
-    addr.sin_family = AF_INET;
+    addr.sin.sin_family = AF_INET;
 # ifdef HAVE_SA_LEN
-    addr.sin_len = sizeof (addr);
+    addr.sin.sin_len = sizeof (addr.sin);
 # endif
-    addr.sin_port = port;
-    addr.sin_addr.s_addr = ip;
+    addr.sin.sin_port = port;
+    addr.sin.sin_addr.s_addr = ip;
 
     return makeaddrinfo (AF_INET, type, proto,
-                         (struct sockaddr*)&addr, sizeof (addr), name);
+                         &addr.sa, sizeof (addr.sin), name);
 }
 
 /*


=====================================
src/stream_output/sap.c
=====================================
@@ -63,11 +63,7 @@ typedef struct sap_address_t
     vlc_cond_t              wait;
 
     char                    group[NI_MAXNUMERICHOST];
-    union {
-        struct sockaddr     a;
-        struct sockaddr_in  in;
-        struct sockaddr_in6 in6;
-    } orig;
+    vlc_sockaddr            orig;
     socklen_t               origlen;
     int                     fd;
     unsigned                interval;
@@ -101,7 +97,7 @@ static sap_address_t *AddressCreate (vlc_object_t *obj, const char *group)
     strlcpy (addr->group, group, sizeof (addr->group));
     addr->fd = fd;
     addr->origlen = sizeof (addr->orig);
-    getsockname(fd, &addr->orig.a, &addr->origlen);
+    getsockname(fd, &addr->orig.sa, &addr->origlen);
 
     addr->interval = var_CreateGetInteger (obj, "sap-interval");
     vlc_cond_init (&addr->wait);
@@ -165,12 +161,7 @@ sout_AnnounceRegisterSDP (vlc_object_t *obj, const char *sdp,
 {
     int i;
     char psz_addr[NI_MAXNUMERICHOST];
-    union
-    {
-        struct sockaddr     a;
-        struct sockaddr_in  in;
-        struct sockaddr_in6 in6;
-    } addr;
+    vlc_sockaddr addr;
     socklen_t addrlen = 0;
     struct addrinfo *res;
 
@@ -191,13 +182,13 @@ sout_AnnounceRegisterSDP (vlc_object_t *obj, const char *sdp,
     }
 
     /* Determine SAP multicast address automatically */
-    switch (addr.a.sa_family)
+    switch (addr.sa.sa_family)
     {
 #if defined (HAVE_INET_PTON) || defined (_WIN32)
         case AF_INET6:
         {
             /* See RFC3513 for list of valid IPv6 scopes */
-            struct in6_addr *a6 = &addr.in6.sin6_addr;
+            struct in6_addr *a6 = &addr.sin6.sin6_addr;
 
             memcpy( a6->s6_addr + 2, "\x00\x00\x00\x00\x00\x00"
                    "\x00\x00\x00\x00\x00\x02\x7f\xfe", 14 );
@@ -214,7 +205,7 @@ sout_AnnounceRegisterSDP (vlc_object_t *obj, const char *sdp,
         case AF_INET:
         {
             /* See RFC2365 for IPv4 scopes */
-            uint32_t ipv4 = addr.in.sin_addr.s_addr;
+            uint32_t ipv4 = addr.sin.sin_addr.s_addr;
 
             /* 224.0.0.0/24 => 224.0.0.255 */
             if ((ipv4 & htonl (0xffffff00)) == htonl (0xe0000000))
@@ -241,17 +232,17 @@ sout_AnnounceRegisterSDP (vlc_object_t *obj, const char *sdp,
                 return NULL;
             }
 
-            addr.in.sin_addr.s_addr = ipv4;
+            addr.sin.sin_addr.s_addr = ipv4;
             break;
         }
 
         default:
             msg_Err (obj, "Address family %u not supported by SAP",
-                     (unsigned)addr.a.sa_family);
+                     (unsigned)addr.sa.sa_family);
             return NULL;
     }
 
-    i = vlc_getnameinfo( &addr.a, addrlen,
+    i = vlc_getnameinfo( &addr.sa, addrlen,
                          psz_addr, sizeof( psz_addr ), NULL, NI_NUMERICHOST );
 
     if( i )
@@ -289,26 +280,26 @@ matched:
     /* SAPv1, not encrypted, not compressed */
     uint8_t flags = 0x20;
 #ifdef AF_INET6
-    if (sap_addr->orig.a.sa_family == AF_INET6)
+    if (sap_addr->orig.sa.sa_family == AF_INET6)
         flags |= 0x10;
 #endif
     vlc_memstream_putc(&stream, flags);
     vlc_memstream_putc(&stream, 0x00); /* No authentication length */
     vlc_memstream_write(&stream, &(uint16_t){ vlc_tick_now() }, 2); /* ID hash */
 
-    switch (sap_addr->orig.a.sa_family)
+    switch (sap_addr->orig.sa.sa_family)
     {
 #ifdef AF_INET6
         case AF_INET6:
         {
-            const struct in6_addr *a6 = &sap_addr->orig.in6.sin6_addr;
+            const struct in6_addr *a6 = &sap_addr->orig.sin6.sin6_addr;
             vlc_memstream_write(&stream, a6, 16);
             break;
         }
 #endif
         case AF_INET:
         {
-            const struct in_addr *a4 = &sap_addr->orig.in.sin_addr;
+            const struct in_addr *a4 = &sap_addr->orig.sin.sin_addr;
             vlc_memstream_write(&stream, a4, 4);
             break;
         }



View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/417580d0df4da2bd9c0e95237227f9791accc1b1...6d8273022f08f20d59c947387351f728b6d51246

-- 
View it on GitLab: https://code.videolan.org/videolan/vlc/-/compare/417580d0df4da2bd9c0e95237227f9791accc1b1...6d8273022f08f20d59c947387351f728b6d51246
You're receiving this email because of your account on code.videolan.org.


VideoLAN code repository instance


More information about the vlc-commits mailing list