The code in ares_nit.c and get_iphlpapi_dns_info()
seems to ignore the 'zone index' for IPv6 DNS-addresesses.

Here is what GetAdaptersAddresses() returns for one of
my adapters (I have IPv6 installed):
    Adapter name: {48FCE3FC-EC30-E50E-F1A7-71172AEEE3AE}
            Unicast Addresses: fe80::5efe:10.0.0.6%2
            Anycast Addresses: <none>
            Multicast Addresses: <none>
            DNS Servers: fec0:0:0:ffff::1%2
                         fec0:0:0:ffff::2%2
                         fec0:0:0:ffff::3%2
                         217.13.4.140
                         217.13.4.24

In get_iphlpapi_dns_info(), the output of GetAdaptersAddresses() is parsed:

       else if( pGenericAddr->sa_family == AF_INET6 && left > ipv6_size )
       {
         /* Handle the v6 case */
         struct sockaddr_in6 *pIPv6Addr = ( struct sockaddr_in6 * ) 
pGenericAddr;
         ares_inet_ntop( AF_INET6, &pIPv6Addr->sin6_addr, ret, ipv6_size - 1 ); 
/* -1 for comma */

ares_inet_ntop() doesn't AFAICS grok the "%zone-index" syntax. Ref.
http://en.wikipedia.org/wiki/IPv6_address#Link-local_addresses_and_zone_indices

The end result will be that C-ares hangs "forever" trying to contact the 
DNS-servers
on such zoneless IPv6 non-global addresses. I think the fix would be to use WSAAddressToString() instead of ares_inet_ntop().

--gv

Reply via email to