[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#854301: libc6: getaddrinfo with AF_UNSPEC and AI_ADDRCONFIG should not return results on offline machine

Package: libc6
Version: 2.24-8
Severity: normal
Tags: upstream patch


for ease of reproducibility I show my examples in Python, but I verified
that the problem is in glibc and not in Python:

On a machine without network access I get:

	>>> import socket
	>>> socket.getaddrinfo("", "http", family=socket.AF_INET, flags=socket.AI_ADDRCONFIG)
	Traceback (most recent call last):
	  File "<stdin>", line 1, in <module>
	  File "/usr/lib/python3.5/socket.py", line 733, in getaddrinfo
	    for res in _socket.getaddrinfo(host, port, family, type, proto, flags):
	socket.gaierror: [Errno -2] Name or service not known

as expected. If however I use AF_UNSPEC instead of AF_INET I get:

	>>> socket.getaddrinfo("", "http", family=socket.AF_UNSPEC, flags=socket.AI_ADDRCONFIG)
	[(<AddressFamily.AF_INET: 2>, <SocketKind.SOCK_STREAM: 1>, 6, '', ('', 80))]

while it should fail in the same way as above instead.

Quoting getaddrinfo(3):

	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 [...].

The following patch should fix this:

--- a/sysdeps/posix/getaddrinfo.c
+++ b/sysdeps/posix/getaddrinfo.c
@@ -2351,7 +2351,8 @@
       else if ((hints->ai_family == PF_INET && ! seen_ipv4)
-	       || (hints->ai_family == PF_INET6 && ! seen_ipv6))
+	       || (hints->ai_family == PF_INET6 && ! seen_ipv6)
+	       || (hints->ai_family == PF_UNSPEC))
 	  /* We cannot possibly return a valid answer.  */
 	  __free_in6ai (in6ai);

Best regards

-- System Information:
Debian Release: 9.0
  APT prefers testing
  APT policy: (800, 'testing'), (600, 'unstable'), (500, 'testing-debug'), (500, 'stable'), (1, 'experimental')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 4.9.0-2-amd64 (SMP w/4 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)

Reply to: