Package: libc6 Version: 2.13-27 Severity: normal Tags: ipv6 getaddrinfo() does not correctly implement the AI_V4MAPPED flag. When requesting AF_INET6 addresses using the AI_V4MAPPED | AI_ALL flags in the request, IPv4 addresses are returned as AF_INET, ie. as standard IPv4 addresses, not IPv6-mapped IPv4 addresses.
A test program is attached that resolves the given hostname and prints the addresses returned. To compile: gcc gai2.c To run: ./a.out he.net Observed output: AF_INET: [216.218.186.2]:80 AF_INET6: [2001:470:0:76::2]:80 Expected output (observed on RHEL 5.2, glibc 2.5-24): AF_INET6: [::ffff:216.218.186.2]:80 AF_INET6: [2001:470:0:76::2]:80 -- System Information: Debian Release: 6.0.4 APT prefers stable APT policy: (990, 'stable'), (500, 'stable-updates'), (500, 'testing') Architecture: amd64 (x86_64) Kernel: Linux 3.0.0-1-amd64 (SMP w/2 CPU cores) Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=locale: Cannot set LC_CTYPE to default locale: No such file or directory locale: Cannot set LC_MESSAGES to default locale: No such file or directory locale: Cannot set LC_ALL to default locale: No such file or directory ANSI_X3.4-1968) Shell: /bin/sh linked to /bin/dash Versions of packages libc6 depends on: ii libc-bin 2.13-27 Embedded GNU C Library: Binaries ii libgcc1 1:4.6.3-1 GCC support library libc6 recommends no packages. Versions of packages libc6 suggests: ii debconf [debconf-2.0] 1.5.36.1 Debian configuration management sy ii glibc-doc 2.11.3-2 Embedded GNU C Library: Documentat pn locales <none> (no description available) -- debconf information: perl: warning: Setting locale failed. perl: warning: Please check that your locale settings: LANGUAGE = (unset), LC_ALL = (unset), LANG = "en_US.UTF-8" are supported and installed on your system. perl: warning: Falling back to the standard locale ("C"). locale: Cannot set LC_CTYPE to default locale: No such file or directory locale: Cannot set LC_MESSAGES to default locale: No such file or directory locale: Cannot set LC_ALL to default locale: No such file or directory * glibc/upgrade: true glibc/disable-screensaver: glibc/restart-failed: * glibc/restart-services: gdm openbsd-inetd exim4 cups cron atd apache2 * libraries/restart-without-asking: true
#include <stdio.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <string.h> int main(int argc, char *argv[]) { struct addrinfo hints, *addrs = NULL, *a = NULL; if (argc < 2) { fprintf(stderr, "Usage: %s <host>\n", argv[0]); return 1; } memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_INET6; hints.ai_flags = AI_V4MAPPED | AI_ALL; hints.ai_socktype = SOCK_STREAM; int e = getaddrinfo(argv[1], "80", &hints, &addrs); if (e) { fprintf(stderr, "getaddrinfo failed: %s\n", gai_strerror(e)); return 2; } for (a = addrs; a; a = a->ai_next) { char host[NI_MAXHOST], port[NI_MAXSERV]; e = getnameinfo(a->ai_addr, a->ai_addrlen, host, sizeof(host), port, sizeof(port), NI_NUMERICHOST | NI_NUMERICSERV); if (e) fprintf(stderr, "getnameinfo failed: %s\n", gai_strerror(e)); printf("%s: [%s]:%s\n", a->ai_family == AF_INET ? "AF_INET" : a->ai_family == AF_INET6 ? "AF_INET6" : a->ai_family == AF_UNSPEC ? "AF_UNSPEC" : "?", e ? "?" : host, e ? "?" : port ); } freeaddrinfo(addrs); return 0; }