Ticket #84: 0001-fix-multihome-for-IPv6-do-check-for-setsockopt-failu.patch

File 0001-fix-multihome-for-IPv6-do-check-for-setsockopt-failu.patch, 2.8 KB (added by jjo, 3 years ago)
  • socket.c

    From d1f9b781499998e6003266e6a8cb44be78664ffb Mon Sep 17 00:00:00 2001
    From: JuanJo Ciarlante <jjo@google.com>
    Date: Sat, 5 Feb 2011 23:52:57 +0100
    Subject: * fix --multihome for IPv6, do check for setsockopt() failures, append %<iface> in INFO msg
    
    ---
     socket.c |   27 +++++++++++++++++----------
     1 files changed, 17 insertions(+), 10 deletions(-)
    
    diff --git a/socket.c b/socket.c
    index 810bb23..08cab0e 100644
    a b create_socket_udp (const unsigned int flags) 
    813813  else if (flags & SF_USE_IP_PKTINFO) 
    814814    { 
    815815      int pad = 1; 
    816       setsockopt (sd, SOL_IP, IP_PKTINFO, (void*)&pad, sizeof(pad)); 
     816      if (setsockopt (sd, SOL_IP, IP_PKTINFO, 
     817                      (void*)&pad, sizeof(pad)) < 0) 
     818        msg(M_SOCKERR, "UDP: failed setsockopt for IP_PKTINFO"); 
    817819    } 
    818820#endif 
    819821  return sd; 
    create_socket_udp6 (const unsigned int flags) 
    831833  else if (flags & SF_USE_IP_PKTINFO) 
    832834    { 
    833835      int pad = 1; 
    834       setsockopt (sd, IPPROTO_IPV6, IPV6_PKTINFO, (void*)&pad, sizeof(pad)); 
     836      if (setsockopt (sd, IPPROTO_IPV6, IPV6_RECVPKTINFO, 
     837                      (void*)&pad, sizeof(pad)) < 0) 
     838        msg(M_SOCKERR, "UDP: failed setsockopt for IPV6_RECVPKTINFO"); 
    835839    } 
    836840#endif 
    837841  return sd; 
    print_link_socket_actual_ex (const struct link_socket_actual *act, 
    24232427{ 
    24242428  if (act) 
    24252429    { 
     2430      char ifname[IF_NAMESIZE] = "[undef]"; 
    24262431      struct buffer out = alloc_buf_gc (128, gc); 
    24272432      buf_printf (&out, "%s", print_sockaddr_ex (&act->dest, separator, flags, gc)); 
    24282433#if ENABLE_IP_PKTINFO 
    print_link_socket_actual_ex (const struct link_socket_actual *act, 
    24382443                  CLEAR (sa); 
    24392444                  sa.addr.in4.sin_family = AF_INET; 
    24402445                  sa.addr.in4.sin_addr = act->pi.in4.ipi_spec_dst; 
    2441                   buf_printf (&out, " (via %s)", print_sockaddr_ex (&sa, separator, 0, gc)); 
     2446                  if_indextoname(act->pi.in4.ipi_ifindex, ifname); 
     2447                  buf_printf (&out, " (via %s%%%s)", 
     2448                              print_sockaddr_ex (&sa, separator, 0, gc), 
     2449                              ifname); 
    24422450                } 
    24432451#ifdef USE_PF_INET6 
    24442452              break; 
    print_link_socket_actual_ex (const struct link_socket_actual *act, 
    24492457                  CLEAR(sin6); 
    24502458                  sin6.sin6_family = AF_INET6; 
    24512459                  sin6.sin6_addr = act->pi.in6.ipi6_addr; 
    2452                     { 
    2453                       if (getnameinfo((struct sockaddr *)&sin6, sizeof (struct sockaddr_in6), 
    2454                                       buf, sizeof (buf), NULL, 0, NI_NUMERICHOST) == 0) 
    2455                         buf_printf (&out, " (via %s)", buf); 
    2456                       else 
    2457                         buf_printf (&out, " (via [getnameinfo() err])"); 
    2458                     } 
     2460                  if_indextoname(act->pi.in6.ipi6_ifindex, ifname); 
     2461                  if (getnameinfo((struct sockaddr *)&sin6, sizeof (struct sockaddr_in6), 
     2462                                  buf, sizeof (buf), NULL, 0, NI_NUMERICHOST) == 0) 
     2463                    buf_printf (&out, " (via %s%%%s)", buf, ifname); 
     2464                  else 
     2465                    buf_printf (&out, " (via [getnameinfo() err]%%%s)", ifname); 
    24592466                } 
    24602467              break; 
    24612468            }