summaryrefslogtreecommitdiffstats
path: root/src/openvpn/socket.c
diff options
context:
space:
mode:
authorGert Doering <gert@greenie.muc.de>2014-01-19 21:51:37 +0100
committerGert Doering <gert@greenie.muc.de>2014-04-25 20:35:23 +0200
commit661d914c8732a208580b1eab167255c85da162c9 (patch)
tree65738dc47e724d71ae35418ca2ac010b1eb40cc1 /src/openvpn/socket.c
parent959d60789b6f0bd74296600f58f626cfa9738f78 (diff)
downloadopenvpn-661d914c8732a208580b1eab167255c85da162c9.tar.gz
openvpn-661d914c8732a208580b1eab167255c85da162c9.tar.xz
openvpn-661d914c8732a208580b1eab167255c85da162c9.zip
Repair --multihome on FreeBSD for IPv4 sockets.
The code in link_socket_write_udp_posix_sendmsg() for the IP_RECVDESTADDR case was sending a too-large control message (sizeof openvpn_pktinfo, which is a union for IPv4+IPv6) instead of just openvpn_in4_pktinfo, leading to sendmsg() refusing to send the packet. Use RFC 2292 macros for alignment + size calculation. Fix trac#327 Signed-off-by: Gert Doering <gert@greenie.muc.de> Lazy-Ack-by: Gert Doering <gert@greenie.muc.de> Message-Id: <1390164697-1590-1-git-send-email-gert@greenie.muc.de> URL: http://article.gmane.org/gmane.network.openvpn.devel/8250
Diffstat (limited to 'src/openvpn/socket.c')
-rw-r--r--src/openvpn/socket.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/src/openvpn/socket.c b/src/openvpn/socket.c
index ed4bc6f..0b3d7ad 100644
--- a/src/openvpn/socket.c
+++ b/src/openvpn/socket.c
@@ -3004,11 +3004,11 @@ link_socket_write_udp_posix_sendmsg (struct link_socket *sock,
mesg.msg_name = &to->dest.addr.sa;
mesg.msg_namelen = sizeof (struct sockaddr_in);
mesg.msg_control = &opi;
- mesg.msg_controllen = sizeof (struct openvpn_in4_pktinfo);
mesg.msg_flags = 0;
+#ifdef HAVE_IN_PKTINFO
+ mesg.msg_controllen = sizeof (struct openvpn_in4_pktinfo);
cmsg = CMSG_FIRSTHDR (&mesg);
cmsg->cmsg_len = sizeof (struct openvpn_in4_pktinfo);
-#ifdef HAVE_IN_PKTINFO
cmsg->cmsg_level = SOL_IP;
cmsg->cmsg_type = IP_PKTINFO;
{
@@ -3019,6 +3019,10 @@ link_socket_write_udp_posix_sendmsg (struct link_socket *sock,
pkti->ipi_addr.s_addr = 0;
}
#elif defined(IP_RECVDSTADDR)
+ ASSERT( CMSG_SPACE(sizeof (struct in_addr)) <= sizeof(opi) );
+ mesg.msg_controllen = CMSG_SPACE(sizeof (struct in_addr));
+ cmsg = CMSG_FIRSTHDR (&mesg);
+ cmsg->cmsg_len = CMSG_LEN(sizeof(struct in_addr));
cmsg->cmsg_level = IPPROTO_IP;
cmsg->cmsg_type = IP_RECVDSTADDR;
*(struct in_addr *) CMSG_DATA (cmsg) = to->pi.in4;