]> git.ipfire.org Git - thirdparty/openvpn.git/commitdiff
* fix --multihome for ipv4: cmsg_len must compare against in_pktinfo
authorJuanJo Ciarlante <jjo+ml@google.com>
Wed, 22 Sep 2010 23:15:35 +0000 (01:15 +0200)
committerJuanJo Ciarlante <juanjosec@gmail.com>
Fri, 25 Mar 2011 12:30:31 +0000 (13:30 +0100)
  size, not the full 4+6 union, also use saner variable names.

socket.c

index 72da7927f2aa5dca480d024e8a75237b313c232c..577ef93b084801d333708b3a4041124cbfc913d8 100644 (file)
--- 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);