From: Ed W Date: Mon, 16 Apr 2012 22:27:55 +0000 (+0100) Subject: inet: adjust handling of cacnonname in getaddrinfo X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=97214b87d6317d75e9a7f6dd69148724c2675e4b;hp=f6f98ad8665811e0d30ee130fc65d965aee6be04;p=uclinux-h8%2FuClibc.git 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 --- 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)