pkgsrc-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[pkgsrc/trunk]: pkgsrc/multimedia/libdvbpsi Fix example to not trigger alignm...



details:   https://anonhg.NetBSD.org/pkgsrc/rev/59bb05cdf70d
branches:  trunk
changeset: 649093:59bb05cdf70d
user:      joerg <joerg%pkgsrc.org@localhost>
date:      Tue Mar 31 15:52:50 2015 +0000

description:
Fix example to not trigger alignment warnings. Fix a real bug while here
-- casting the address of ai_addr to sockaddr_* is not a good idea.

diffstat:

 multimedia/libdvbpsi/distinfo                             |    4 +-
 multimedia/libdvbpsi/patches/patch-examples_dvbinfo_udp.c |  115 +++++++++++++-
 2 files changed, 114 insertions(+), 5 deletions(-)

diffs (142 lines):

diff -r 25a4e752b80b -r 59bb05cdf70d multimedia/libdvbpsi/distinfo
--- a/multimedia/libdvbpsi/distinfo     Tue Mar 31 15:51:42 2015 +0000
+++ b/multimedia/libdvbpsi/distinfo     Tue Mar 31 15:52:50 2015 +0000
@@ -1,6 +1,6 @@
-$NetBSD: distinfo,v 1.13 2014/04/17 12:28:56 wiz Exp $
+$NetBSD: distinfo,v 1.14 2015/03/31 15:52:50 joerg Exp $
 
 SHA1 (libdvbpsi-1.2.0.tar.bz2) = b918985f65e1d14bf19209b6b3def254c902901a
 RMD160 (libdvbpsi-1.2.0.tar.bz2) = 0c14a32f1cab0dbe834bcb02cbc8cc9a6fc47752
 Size (libdvbpsi-1.2.0.tar.bz2) = 461372 bytes
-SHA1 (patch-examples_dvbinfo_udp.c) = 7c1829ca0cfd7f1c6f051569bb8b0ab0e01f1f9e
+SHA1 (patch-examples_dvbinfo_udp.c) = 4d4360780a3d54cdd669760235df7a67d296989e
diff -r 25a4e752b80b -r 59bb05cdf70d multimedia/libdvbpsi/patches/patch-examples_dvbinfo_udp.c
--- a/multimedia/libdvbpsi/patches/patch-examples_dvbinfo_udp.c Tue Mar 31 15:51:42 2015 +0000
+++ b/multimedia/libdvbpsi/patches/patch-examples_dvbinfo_udp.c Tue Mar 31 15:52:50 2015 +0000
@@ -1,10 +1,11 @@
-$NetBSD: patch-examples_dvbinfo_udp.c,v 1.2 2013/10/05 08:29:38 wiz Exp $
+$NetBSD: patch-examples_dvbinfo_udp.c,v 1.3 2015/03/31 15:52:51 joerg Exp $
 
 Portability fix from upstream (Jean-Paul Saman <jpsaman%videolan.org@localhost>).
+Don't cast alignments away.
 
---- examples/dvbinfo/udp.c.orig        2013-10-02 10:19:18.000000000 +0000
+--- examples/dvbinfo/udp.c.orig        2014-04-16 07:22:14.000000000 +0000
 +++ examples/dvbinfo/udp.c
-@@ -61,6 +61,16 @@
+@@ -61,43 +61,53 @@
  #   include <fcntl.h>
  #endif
  
@@ -21,3 +22,111 @@
  #include <assert.h>
  
  #include "udp.h"
+ 
+ #ifdef HAVE_SYS_SOCKET_H
+-static bool is_multicast(const struct sockaddr_storage *saddr, socklen_t len)
++static bool is_multicast(const struct sockaddr *addr, socklen_t len)
+ {
+-    const struct sockaddr *addr = (const struct sockaddr *) saddr;
+ 
+     switch(addr->sa_family)
+     {
+ #if defined(IN_MULTICAST)
+         case AF_INET:
+         {
+-            const struct sockaddr_in *ip = (const struct sockaddr_in *)saddr;
+-            if ((size_t)len < sizeof (*ip))
++            struct sockaddr_in ip;
++            if ((size_t)len < sizeof (ip))
+                 return false;
+-            return IN_MULTICAST(ntohl(ip->sin_addr.s_addr)) != 0;
++            memcpy(&ip, addr, sizeof(ip));
++            return IN_MULTICAST(ntohl(ip.sin_addr.s_addr)) != 0;
+         }
+ #endif
+ #if defined(IN6_IS_ADDR_MULTICAST)
+         case AF_INET6:
+         {
+-            const struct sockaddr_in6 *ip6 = (const struct sockaddr_in6 *)saddr;
+-            if ((size_t)len < sizeof (*ip6))
++            struct sockaddr_in6 ip6;
++            if ((size_t)len < sizeof (ip6))
+                 return false;
+-            return IN6_IS_ADDR_MULTICAST(&ip6->sin6_addr) != 0;
++            memcpy(&ip6, addr, sizeof(ip6));
++            return IN6_IS_ADDR_MULTICAST(&ip6.sin6_addr) != 0;
+         }
+ #endif
+     }
+     return false;
+ }
+ 
+-static bool mcast_connect(int s, const char *interface, const struct sockaddr_storage *saddr, socklen_t len)
++static bool mcast_connect(int s, const char *interface, const struct sockaddr *addr, socklen_t len)
+ {
+     unsigned int ifindex = interface ? if_nametoindex(interface) : 0;
+-    const struct sockaddr *addr = (const struct sockaddr *) saddr;
+ 
+ #if defined(MCAST_JOIN_GROUP)
+     /* Source Specific Multicast Join */
+@@ -115,10 +125,13 @@ static bool mcast_connect(int s, const c
+     {
+         case AF_INET6:
+         {
+-            const struct sockaddr_in6 *sin6 = (const struct sockaddr_in6 *)saddr;
++            struct sockaddr_in6 sin6;
+             assert(len >= sizeof (struct sockaddr_in6));
+-            if (sin6->sin6_scope_id != 0)
+-                greq.gr_interface = sin6->sin6_scope_id;
++            memcpy(&sin6, addr, sizeof(sin6));
++            if (sin6.sin6_scope_id != 0) {
++                greq.gr_interface = sin6.sin6_scope_id;
++                memcpy(&greq.gr_group, &sin6, sizeof(sin6));
++            }
+             if (setsockopt(s, SOL_IPV6, MCAST_JOIN_GROUP, &greq, sizeof(greq)) == 0)
+                 return true;
+             break;
+@@ -136,12 +149,14 @@ static bool mcast_connect(int s, const c
+         case AF_INET6:
+         {
+             struct ipv6_mreq ipv6mr;
+-            const struct sockaddr_in6 *ip6 = (const struct sockaddr_in6 *)saddr;
++            struct sockaddr_in6 ip6;
++            assert(len >= sizeof (struct sockaddr_in6));
++            memcpy(&ip6, addr, sizeof(ip6));
+ 
+             memset(&ipv6mr, 0, sizeof (ipv6mr));
+             assert(len >= sizeof (struct sockaddr_in6));
+-            ipv6mr.ipv6mr_multiaddr = ip6->sin6_addr;
+-            ipv6mr.ipv6mr_interface = (ifindex > 0) ? ifindex : ip6->sin6_scope_id;
++            ipv6mr.ipv6mr_multiaddr = ip6.sin6_addr;
++            ipv6mr.ipv6mr_interface = (ifindex > 0) ? ifindex : ip6.sin6_scope_id;
+ # ifdef IPV6_JOIN_GROUP
+             if (setsockopt(s, SOL_IPV6, IPV6_JOIN_GROUP, &ipv6mr, sizeof (ipv6mr)) == 0)
+ # else
+@@ -154,10 +169,12 @@ static bool mcast_connect(int s, const c
+         case AF_INET:
+         {
+             struct ip_mreq imr;
++            struct sockaddr_in ip;
+ 
+             memset(&imr, 0, sizeof (imr));
+             assert(len >= sizeof (struct sockaddr_in));
+-            imr.imr_multiaddr = ((const struct sockaddr_in *)saddr)->sin_addr;
++            memcpy(&ip, addr, sizeof(ip));
++            imr.imr_multiaddr = ip.sin_addr;
+ #if 0       /* TODO: Source Specific Multicast Join */
+             if (ifaddr) /* Linux specific interface bound multicast address */
+                imr.imr_address.s_addr = if_addr;
+@@ -284,9 +301,8 @@ int udp_open(const char *interface, cons
+             continue;
+         }
+ 
+-        const struct sockaddr_storage *saddr = (const struct sockaddr_storage *)&ptr->ai_addr;
+-        if (is_multicast(saddr, ptr->ai_addrlen) &&
+-            mcast_connect(s_ctl, NULL, saddr, ptr->ai_addrlen))
++        if (is_multicast(ptr->ai_addr, ptr->ai_addrlen) &&
++            mcast_connect(s_ctl, NULL, ptr->ai_addr, ptr->ai_addrlen))
+         {
+             close(s_ctl);
+             s_ctl = -1;



Home | Main Index | Thread Index | Old Index