Fix fake getnameinfo() and check more arguments.
authorGuus Sliepen <guus@tinc-vpn.org>
Sun, 17 Aug 2003 08:32:39 +0000 (08:32 +0000)
committerGuus Sliepen <guus@tinc-vpn.org>
Sun, 17 Aug 2003 08:32:39 +0000 (08:32 +0000)
lib/fake-gai-errnos.h
lib/fake-getaddrinfo.c
lib/fake-getnameinfo.c

index fc65fa74635a9920dadf96eb7e597143f304d887..f54cf55ca40dd3124b38e70b8402f311617652a6 100644 (file)
@@ -5,10 +5,11 @@
  * See getaddrinfo.c and getnameinfo.c.
  */
 
-/* $Id: fake-gai-errnos.h,v 1.1.2.2 2003/07/12 17:41:45 guus Exp $ */
+/* $Id: fake-gai-errnos.h,v 1.1.2.3 2003/08/17 08:32:38 guus Exp $ */
 
 /* for old netdb.h */
 #ifndef EAI_NODATA
 #define EAI_NODATA     1
 #define EAI_MEMORY     2
+#define EAI_FAMILY     3
 #endif
index 0c9fae94dda83b5d18f67256cf9b1c372b29a87f..161c826f3728e2cbaf531ebc61242e4f6e9001db 100644 (file)
@@ -23,6 +23,8 @@ char *gai_strerror(int ecode)
                        return "No address associated with hostname";
                case EAI_MEMORY:
                        return "Memory allocation failure";
+               case EAI_FAMILY:
+                       return "Address family not supported";
                default:
                        return "Unknown error";
        }
@@ -67,6 +69,9 @@ int getaddrinfo(const char *hostname, const char *servname, const struct addrinf
        int i;
        uint16_t port = 0;
 
+       if(hints && hints->ai_family != AF_INET && hints->ai_family != AF_UNSPEC)
+               return EAI_FAMILY;
+
        if (servname)
                port = htons(atoi(servname));
 
@@ -82,7 +87,7 @@ int getaddrinfo(const char *hostname, const char *servname, const struct addrinf
        
        hp = gethostbyname(hostname);
 
-       if(!hp || !hp->h_addr_list[0])
+       if(!hp || !hp->h_addr_list || !hp->h_addr_list[0])
                return EAI_NODATA;
 
        for (i = 0; hp->h_addr_list[i]; i++) {
index 6630decc42f90e2a76a7d8df6e44abbd9e0fddb5..a0e1df33752ba27564388871ca6cf1c6e74dd631 100644 (file)
@@ -20,27 +20,36 @@ int getnameinfo(const struct sockaddr *sa, size_t salen, char *host, size_t host
 {
        struct sockaddr_in *sin = (struct sockaddr_in *)sa;
        struct hostent *hp;
+       int len;
 
-       if(serv)
-               snprintf(serv, sizeof(tmpserv), "%d", ntohs(sin->sin_port));
+       if(sa->sa_family != AF_INET)
+               return EAI_FAMILY;
 
-       if(!host)
+       if(serv && servlen) {
+               len = snprintf(serv, servlen, "%d", ntohs(sin->sin_port));
+               if(len < 0 || len >= servlen)
+                       return EAI_MEMORY;
+       }
+
+       if(!host || !hostlen)
                return 0;
 
        if(flags & NI_NUMERICHOST) {
-               strncpy(host, inet_ntoa(sin->sin_addr), sizeof(host));
+               len = snprintf((host, hostlen, "%s", inet_ntoa(sin->sin_addr));
+               if(len < 0 || len >= hostlen)
+                       return EAI_MEMORY;
                return 0;
        }
 
        hp = gethostbyaddr((char *)&sin->sin_addr, sizeof(struct in_addr), AF_INET);
        
-       if(!hp || !hp->h_name)
+       if(!hp || !hp->h_name || !hp->h_name[0])
                return EAI_NODATA;
        
-       if(strlen(hp->h_name) >= hostlen)
+       len = snprintf((host, hostlen, "%s", hp->h_name);
+       if(len < 0 || len >= hostlen)
                return EAI_MEMORY;
 
-       strncpy(host, hp->h_name, hostlen);
        return 0;
 }
 #endif /* !HAVE_GETNAMEINFO */