With python 2.7.5 (running on fedora 20 with all updates), socket.getaddrinfo for a hostname such as 836937931829 will fail. Docker produces these sorts of hostnames (really random hex strings, but some hex strings only contain digits 0-9).
How to reproduce:
Add the lines
172.17.10.53 blobber
172.17.10.54 836937931829
to /etc/hosts
run the following:
import socket
print socket.getaddrinfo('172.17.10.53',80,socket.AF_INET,0,socket.SOL_TCP)
print socket.getaddrinfo('blobber',80,socket.AF_INET,0,socket.SOL_TCP)
print socket.getaddrinfo('172.17.10.54',80,socket.AF_INET,0,socket.SOL_TCP)
print socket.getaddrinfo('836937931829',80,socket.AF_INET,0,socket.SOL_TCP)
Expected output:
[(2, 1, 6, '', ('172.17.10.53', 80))]
[(2, 1, 6, '', ('172.17.10.53', 80))]
[(2, 1, 6, '', ('172.17.10.54', 80))]
[(2, 1, 6, '', ('172.17.10.54', 80))]
Actual output:
[(2, 1, 6, '', ('172.17.10.53', 80))]
[(2, 1, 6, '', ('172.17.10.53', 80))]
[(2, 1, 6, '', ('172.17.10.54', 80))]
Traceback (most recent call last):
File "./test-getaddrinfo.py", line 6, in <module>
print socket.getaddrinfo('836937931829',80,socket.AF_INET,0,socket.SOL_TCP)
socket.gaierror: [Errno -2] Name or service not known
|
The culprint isn't Python, but the libc:
"""
$ ./python -c "import socket; print(socket.getaddrinfo('836937931829', 80, socket.AF_INET, 0, socket.SOL_TCP))"
Traceback (most recent call last):
File "<string>", line 1, in <module>
socket.gaierror: [Errno -2] Name or service not known
"""
But with AF_UNSPEC:
"""
$ ./python -c "import socket; print(socket.getaddrinfo('836937931829', 80, socket.AF_UNSPEC, 0, socket.SOL_TCP))"
[(2, 1, 6, '', ('172.17.10.54', 80))]
"""
And gdb confirms that the arguments are correctly passed to the libc:
"""
$ gdb --args ./python -c "import socket; print(socket.getaddrinfo('836937931829', 80, socket.AF_INET, 0, socket.SOL_TCP))"
Breakpoint 1, __GI_getaddrinfo (name=0xb7cc9c84 "836937931829", service=0xbffff24e "80", hints=0xbffff278, pai=0xbffff274) at ../sysdeps/posix/getaddrinfo.c:2379
(gdb) p *hints
$4 = {ai_flags = 0, ai_family = 2, ai_socktype = 0, ai_protocol = 6, ai_addrlen = 0, ai_addr = 0x0, ai_canonname = 0x0, ai_next = 0x0}
"""
You can also check directly with getaddrinfo(3).
|