From d87700c92956684116475062cc34755234330fd5 Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9mi=20Denis-Courmont?= Date: Fri, 2 Mar 2007 17:14:38 +0000 Subject: [PATCH] - Return errors in case of overflow - Do not use non-thread-safe stuff --- src/network/getaddrinfo.c | 47 ++++++++++----------------------------- 1 file changed, 12 insertions(+), 35 deletions(-) diff --git a/src/network/getaddrinfo.c b/src/network/getaddrinfo.c index 3df9be5d31..40d6a0ce37 100644 --- a/src/network/getaddrinfo.c +++ b/src/network/getaddrinfo.c @@ -163,50 +163,27 @@ __getnameinfo( const struct sockaddr *sa, socklen_t salen, if (host != NULL) { - int solved = 0; - /* host name resolution */ if (!(flags & NI_NUMERICHOST)) { - struct hostent *hent; - - hent = gethostbyaddr ((const void*)&addr->sin_addr, - 4, AF_INET); - - if (hent != NULL) - { - strlcpy (host, hent->h_name, hostlen); - - /* - * only keep first part of hostname - * if user don't want fully qualified - * domain name - */ - if (flags & NI_NOFQDN) - { - char *ptr; - - ptr = strchr (host, '.'); - if (ptr != NULL) - *ptr = 0; - } - - solved = 1; - } - else if (flags & NI_NAMEREQD) - return gai_error_from_herrno (); + if (flags & NI_NAMEREQD) + return EAI_NONAME; } - if (!solved) - /* inet_ntoa() can't fail */ - strlcpy (host, inet_ntoa (addr->sin_addr), hostlen); + /* inet_ntoa() is not thread-safe, do not use it */ + uint32_t ipv4 = ntohl (addr->sin_addr); + + if (snprintf (host, hostlen, "%u.%u.%u.%u", ipv4 >> 24, + (ipv4 >> 16) & 0xff, (ipv4 >> 8) & 0xff, + ipv4 & 0xff) >= hostlen) + return EAI_OVERFLOW; } if (serv != NULL) { - snprintf (serv, servlen, "%u", - (unsigned int)ntohs (addr->sin_port)); - serv[servlen - 1] = '\0'; + if (snprintf (serv, servlen, "%u", + (unsigned int)ntohs (addr->sin_port)) >= servlen) + return EAI_OVERFLOW; } } return 0; -- 2.20.1