[ 
https://issues.apache.org/jira/browse/THRIFT-5880?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

James E. King III updated THRIFT-5880:
--------------------------------------
    Fix Version/s: 0.23.0

> C++ TSocket on an IPv6-only system fails if you use a hostname of 127.0.0.1
> ---------------------------------------------------------------------------
>
>                 Key: THRIFT-5880
>                 URL: https://issues.apache.org/jira/browse/THRIFT-5880
>             Project: Thrift
>          Issue Type: Bug
>          Components: C++ - Library
>    Affects Versions: 0.20.0
>            Reporter: James E. King III
>            Assignee: James E. King III
>            Priority: Minor
>             Fix For: 0.23.0
>
>         Attachments: resolvtest.c
>
>
> {{The TSocket code uses AI_ADDRCONFIG to resolve the hostname and retrieve A 
> and AAAA records for IPv6 compatibility.  There's a nasty corner case 
> documented in the [getaddrinfo() 
> documentation|https://linux.die.net/man/3/getaddrinfo]:}}
> {quote}{{If _hints.ai_flags_ includes the *AI_ADDRCONFIG* flag, then IPv4 
> addresses are returned in the list pointed to by _res_ only if the local 
> system has at least one IPv4 address configured, and IPv6 addresses are only 
> returned if the local system has at least one IPv6 address configured. The 
> loopback address is not considered for this case as valid as a configured 
> address. }}
> {quote}
> {{Therefore on a system that has only IPv6 interfaces with the exception of 
> loopback, using AI_ADDRINFO results in an EAI_ADDRFAMILY error:}}
> {{# ifconfig}}
> {{eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500}}
> {{        inet6 ffff:ffff:ffff:ffff::ffff  prefixlen 128  scopeid 
> 0x0<global>}}
> {{        inet6 ffff::ffff:ff:ffff:ffff  prefixlen 64  scopeid 0x20<link>}}
> {{        ether ff:ff:ff:ff:ff:ff  txqueuelen 10000  (Ethernet)}}
> {{        RX packets 118419  bytes 352689119 (336.3 MiB)}}
> {{        RX errors 0  dropped 4  overruns 0  frame 0}}
> {{        TX packets 101312  bytes 43358432 (41.3 MiB)}}
> {{        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0}}
> {{lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536}}
> {{        inet 127.0.0.1  netmask 255.0.0.0}}
> {{        inet6 ::1  prefixlen 128  scopeid 0x10<host>}}
> {{        loop  txqueuelen 1000  (Local Loopback)}}
> {{        RX packets 2343  bytes 277200 (270.7 KiB)}}
> {{        RX errors 0  dropped 0  overruns 0  frame 0}}
> {{        TX packets 2343  bytes 277200 (270.7 KiB)}}
> {{        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0}}
> Calling getaddrinfo() on "127.0.0.1" causes this error.  I generated a test 
> program to validate the behavior:
> {{# ## without AI_ADDRCONFIG - it works}}
> {{# ./resolvtest 127.0.0.1}}
> {{Resolving hostname: 127.0.0.1}}
> {{Resolution successful. Results:}}
> {{  1: IPv4: 127.0.0.1}}
> {{     Family: 2, Socket type: 1, Protocol: 6}}
> {{# ./resolvtest -c 127.0.0.1}}
> {{Using AI_ADDRCONFIG flag}}
> {{Resolving hostname: 127.0.0.1}}
> {{getaddrinfo error: Address family for hostname not supported}}
> {{I attached the test program as well.}}
> {{The fix is simple: in TSocket.cpp around line 466 where we check for an 
> EAI_NODATA response, we should also check for EAI_ADDRFAMILY.}}



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to