diff options
-rw-r--r-- | multimedia/libdvbpsi/distinfo | 4 | ||||
-rw-r--r-- | multimedia/libdvbpsi/patches/patch-examples_dvbinfo_udp.c | 115 |
2 files changed, 114 insertions, 5 deletions
diff --git a/multimedia/libdvbpsi/distinfo b/multimedia/libdvbpsi/distinfo index 423bb3b1065..b8297ea20d8 100644 --- a/multimedia/libdvbpsi/distinfo +++ b/multimedia/libdvbpsi/distinfo @@ -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 --git a/multimedia/libdvbpsi/patches/patch-examples_dvbinfo_udp.c b/multimedia/libdvbpsi/patches/patch-examples_dvbinfo_udp.c index fd3a37bd4f2..d8b28c89a6a 100644 --- a/multimedia/libdvbpsi/patches/patch-examples_dvbinfo_udp.c +++ b/multimedia/libdvbpsi/patches/patch-examples_dvbinfo_udp.c @@ -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>). +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 @@ Portability fix from upstream (Jean-Paul Saman <jpsaman@videolan.org>). #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; |