From: JuanJo Ciarlante Date: Wed, 22 Sep 2010 23:15:35 +0000 (+0200) Subject: * fix --multihome for ipv4: cmsg_len must compare against in_pktinfo X-Git-Tag: v2.3-alpha1~240^2~5 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=830038fce4a30f317eb265079f91d9555981ad76;p=thirdparty%2Fopenvpn.git * fix --multihome for ipv4: cmsg_len must compare against in_pktinfo size, not the full 4+6 union, also use saner variable names. --- diff --git a/socket.c b/socket.c index 72da7927f..577ef93b0 100644 --- a/socket.c +++ b/socket.c @@ -2466,6 +2466,7 @@ print_link_socket_actual_ex (const struct link_socket_actual *act, { struct openvpn_sockaddr sa; CLEAR (sa); + sa.addr.in4.sin_family = AF_INET; sa.addr.in4.sin_addr = act->pi.in4.ipi_spec_dst; buf_printf (&out, " (via %s)", print_sockaddr_ex (&sa, separator, 0, gc)); } @@ -2807,7 +2808,7 @@ link_socket_read_tcp (struct link_socket *sock, struct openvpn_in4_pktinfo { struct cmsghdr cmsghdr; - struct in_pktinfo pi; + struct in_pktinfo pi4; }; #ifdef USE_PF_INET6 struct openvpn_in6_pktinfo @@ -2818,9 +2819,9 @@ struct openvpn_in6_pktinfo #endif union openvpn_pktinfo { - struct openvpn_in4_pktinfo cmsgpi; + struct openvpn_in4_pktinfo msgpi4; #ifdef USE_PF_INET6 - struct openvpn_in6_pktinfo cmsgpi6; + struct openvpn_in6_pktinfo msgpi6; #endif }; #pragma pack() @@ -2843,7 +2844,7 @@ link_socket_read_udp_posix_recvmsg (struct link_socket *sock, mesg.msg_name = &from->dest.addr; mesg.msg_namelen = fromlen; mesg.msg_control = &opi; - mesg.msg_controllen = sizeof (opi); + mesg.msg_controllen = sizeof opi; buf->len = recvmsg (sock->sd, &mesg, 0); if (buf->len >= 0) { @@ -2854,7 +2855,7 @@ link_socket_read_udp_posix_recvmsg (struct link_socket *sock, && CMSG_NXTHDR (&mesg, cmsg) == NULL && cmsg->cmsg_level == SOL_IP && cmsg->cmsg_type == IP_PKTINFO - && cmsg->cmsg_len >= sizeof (opi)) + && cmsg->cmsg_len >= sizeof (struct openvpn_in4_pktinfo)) { struct in_pktinfo *pkti = (struct in_pktinfo *) CMSG_DATA (cmsg); from->pi.in4.ipi_ifindex = pkti->ipi_ifindex; @@ -2942,15 +2943,15 @@ link_socket_write_udp_posix_sendmsg (struct link_socket *sock, { case AF_INET: { - struct openvpn_in4_pktinfo opi; + struct openvpn_in4_pktinfo msgpi4; struct in_pktinfo *pkti; mesg.msg_name = &to->dest.addr.sa; mesg.msg_namelen = sizeof (struct sockaddr_in); - mesg.msg_control = &opi; - mesg.msg_controllen = sizeof (opi); + mesg.msg_control = &msgpi4; + mesg.msg_controllen = sizeof msgpi4; mesg.msg_flags = 0; cmsg = CMSG_FIRSTHDR (&mesg); - cmsg->cmsg_len = sizeof (opi); + cmsg->cmsg_len = sizeof (struct openvpn_in4_pktinfo); cmsg->cmsg_level = SOL_IP; cmsg->cmsg_type = IP_PKTINFO; pkti = (struct in_pktinfo *) CMSG_DATA (cmsg); @@ -2962,15 +2963,15 @@ link_socket_write_udp_posix_sendmsg (struct link_socket *sock, #ifdef USE_PF_INET6 case AF_INET6: { - struct openvpn_in6_pktinfo opi6; + struct openvpn_in6_pktinfo msgpi6; struct in6_pktinfo *pkti6; mesg.msg_name = &to->dest.addr.sa; mesg.msg_namelen = sizeof (struct sockaddr_in6); - mesg.msg_control = &opi6; - mesg.msg_controllen = sizeof (opi6); + mesg.msg_control = &msgpi6; + mesg.msg_controllen = sizeof msgpi6; mesg.msg_flags = 0; cmsg = CMSG_FIRSTHDR (&mesg); - cmsg->cmsg_len = sizeof (opi6); + cmsg->cmsg_len = sizeof (struct openvpn_in6_pktinfo); cmsg->cmsg_level = IPPROTO_IPV6; cmsg->cmsg_type = IPV6_PKTINFO; pkti6 = (struct in6_pktinfo *) CMSG_DATA (cmsg);