From 97214b87d6317d75e9a7f6dd69148724c2675e4b Mon Sep 17 00:00:00 2001 From: Ed W Date: Mon, 16 Apr 2012 23:27:55 +0100 Subject: inet: adjust handling of cacnonname in getaddrinfo Posix says that canonname should use the text representation of an IP address when a numerical nodename given See: http://pubs.opengroup.org/onlinepubs/9699919799/functions/getaddrinfo.html Signed-off-by: Ed Wildgoose Signed-off-by: Bernhard Reutner-Fischer --- libc/inet/getaddrinfo.c | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) (limited to 'libc/inet') diff --git a/libc/inet/getaddrinfo.c b/libc/inet/getaddrinfo.c index e7511f6c4..fe0d942d9 100644 --- a/libc/inet/getaddrinfo.c +++ b/libc/inet/getaddrinfo.c @@ -628,13 +628,20 @@ gaih_inet(const char *name, const struct gaih_service *service, char buffer[sizeof("ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255")]; while (at2 != NULL) { - if (req->ai_flags & AI_CANONNAME) { + c = inet_ntop(at2->family, at2->addr, buffer, sizeof(buffer)); + if (c) { + namelen = strlen(c) + 1; + } else if (req->ai_flags & AI_CANONNAME) { struct hostent *h = NULL; int herrno; struct hostent th; size_t tmpbuflen = 512; char *tmpbuf; + /* Hint says numeric, but address is not */ + if (req->ai_flags & AI_NUMERICHOST) + return -EAI_NONAME; + do { tmpbuflen *= 2; tmpbuf = alloca(tmpbuflen); @@ -656,9 +663,7 @@ gaih_inet(const char *name, const struct gaih_service *service, return -EAI_SYSTEM; } - if (h == NULL) - c = inet_ntop(at2->family, at2->addr, buffer, sizeof(buffer)); - else + if (h != NULL) c = h->h_name; if (c == NULL) -- cgit v1.2.3