Package: mumble
Version: 1.2.3-349-g315b5f5-2.2+deb7u1
Severity: normal
Tags: patch

Apparently UDP communication with other users fails until the mic is activated 
and data sent in some cases due to not finding the correct source address.  
More information in commit aab9cdcce4e4c9c8a0656ce980aecc02745801ef :

   
https://github.com/mumble-voip/mumble/commit/aab9cdcce4e4c9c8a0656ce980aecc02745801ef

patch for 1.2.3-349-g315b5f5-2.2+deb7u1 attached.

  -- Chris

--
Chris Knadle
chris.kna...@coredump.us
Description: If the source address of outgoing packets is not detected
 correctly, users connected to a mumble server cannot hear anyone speak until
 first activating and speaking through their mic.
Author: Chris Knadle <chris.kna...@coredump.us>
Origin: https://github.com/mumble-voip/mumble/issues/1147
Applied-Upstream: commit aab9cdcce4e4c9c8a0656ce980aecc02745801ef
Last-Updated: 2014-03-18

--- a/src/murmur/Server.cpp
+++ b/src/murmur/Server.cpp
@@ -845,20 +845,23 @@
                msg.msg_controllen = CMSG_SPACE((u->saiUdpAddress.ss_family == 
AF_INET6) ? sizeof(struct in6_pktinfo) : sizeof(struct in_pktinfo));
 
                struct cmsghdr *cmsg = CMSG_FIRSTHDR(&msg);
-               if (u->saiTcpLocalAddress.ss_family == AF_INET6) {
+               HostAddress tcpha(u->saiTcpLocalAddress);
+               if (u->saiUdpAddress.ss_family == AF_INET6) {
                        cmsg->cmsg_level = IPPROTO_IPV6;
                        cmsg->cmsg_type = IPV6_PKTINFO;
                        cmsg->cmsg_len = CMSG_LEN(sizeof(struct in6_pktinfo));
                        struct in6_pktinfo *pktinfo = reinterpret_cast<struct 
in6_pktinfo *>(CMSG_DATA(cmsg));
                        memset(pktinfo, 0, sizeof(*pktinfo));
-                       pktinfo->ipi6_addr =  reinterpret_cast<struct 
sockaddr_in6 *>(& u->saiTcpLocalAddress)->sin6_addr;
+                       memcpy(&pktinfo->ipi6_addr.s6_addr[0], 
&tcpha.qip6.c[0], sizeof(pktinfo->ipi6_addr.s6_addr));
                } else {
                        cmsg->cmsg_level = IPPROTO_IP;
                        cmsg->cmsg_type = IP_PKTINFO;
                        cmsg->cmsg_len = CMSG_LEN(sizeof(struct in_pktinfo));
                        struct in_pktinfo *pktinfo = reinterpret_cast<struct 
in_pktinfo *>(CMSG_DATA(cmsg));
                        memset(pktinfo, 0, sizeof(*pktinfo));
-                       pktinfo->ipi_spec_dst =  reinterpret_cast<struct 
sockaddr_in *>(& u->saiTcpLocalAddress)->sin_addr;
+                       if (tcpha.isV6())
+                               return;
+                       pktinfo->ipi_spec_dst.s_addr = tcpha.hash[3];
                }

Reply via email to