diff options
author | Gert Doering <gert@greenie.muc.de> | 2014-01-19 21:51:37 +0100 |
---|---|---|
committer | Gert Doering <gert@greenie.muc.de> | 2014-04-25 20:35:23 +0200 |
commit | 661d914c8732a208580b1eab167255c85da162c9 (patch) | |
tree | 65738dc47e724d71ae35418ca2ac010b1eb40cc1 /src/openvpn/socket.c | |
parent | 959d60789b6f0bd74296600f58f626cfa9738f78 (diff) | |
download | openvpn-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.c | 8 |
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; |