X-Git-Url: https://www.tinc-vpn.org/git/browse?p=tinc;a=blobdiff_plain;f=lib%2Ffake-getnameinfo.c;h=a0e1df33752ba27564388871ca6cf1c6e74dd631;hp=6630decc42f90e2a76a7d8df6e44abbd9e0fddb5;hb=2236e05e518c9e317d82c027596bea5228725214;hpb=f4e80cc5e0d1689bcdd828ac7f158bd634b7dd20 diff --git a/lib/fake-getnameinfo.c b/lib/fake-getnameinfo.c index 6630decc..a0e1df33 100644 --- a/lib/fake-getnameinfo.c +++ b/lib/fake-getnameinfo.c @@ -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 */