X-Git-Url: https://tinc-vpn.org/git/browse?a=blobdiff_plain;f=lib%2Ffake-getaddrinfo.c;h=0c27025bd19fdce5e92e83a35189dd73d252664e;hb=f02d3ed3e135b5326003e7f69f8331ff6a3cc219;hp=0c9fae94dda83b5d18f67256cf9b1c372b29a87f;hpb=03995ca52ee31ed505902a3c8c3d1119988c8497;p=tinc diff --git a/lib/fake-getaddrinfo.c b/lib/fake-getaddrinfo.c index 0c9fae94..0c27025b 100644 --- a/lib/fake-getaddrinfo.c +++ b/lib/fake-getaddrinfo.c @@ -14,15 +14,17 @@ #include "ipv4.h" #include "ipv6.h" #include "fake-getaddrinfo.h" +#include "xalloc.h" #ifndef HAVE_GAI_STRERROR -char *gai_strerror(int ecode) -{ +char *gai_strerror(int ecode) { switch (ecode) { case EAI_NODATA: 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"; } @@ -30,8 +32,7 @@ char *gai_strerror(int ecode) #endif /* !HAVE_GAI_STRERROR */ #ifndef HAVE_FREEADDRINFO -void freeaddrinfo(struct addrinfo *ai) -{ +void freeaddrinfo(struct addrinfo *ai) { struct addrinfo *next; while(ai) { @@ -43,8 +44,7 @@ void freeaddrinfo(struct addrinfo *ai) #endif /* !HAVE_FREEADDRINFO */ #ifndef HAVE_GETADDRINFO -static struct addrinfo *malloc_ai(uint16_t port, uint32_t addr) -{ +static struct addrinfo *malloc_ai(uint16_t port, uint32_t addr) { struct addrinfo *ai; ai = xmalloc_and_zero(sizeof(struct addrinfo) + sizeof(struct sockaddr_in)); @@ -59,14 +59,16 @@ static struct addrinfo *malloc_ai(uint16_t port, uint32_t addr) return ai; } -int getaddrinfo(const char *hostname, const char *servname, const struct addrinfo *hints, struct addrinfo **res) -{ +int getaddrinfo(const char *hostname, const char *servname, const struct addrinfo *hints, struct addrinfo **res) { struct addrinfo *prev = NULL; struct hostent *hp; struct in_addr in = {0}; 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 +84,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++) {