From: Miroslav Lichvar Date: Tue, 2 Mar 2021 16:24:09 +0000 (+0100) Subject: nameserv: avoid unnecessary getaddrinfo() calls X-Git-Tag: 4.1-pre1~39 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=579d8c9907e3c2a536d68662f06aaf08b7d8fecf;p=thirdparty%2Fchrony.git nameserv: avoid unnecessary getaddrinfo() calls Check if the name passed to DNS_Name2IPAddress() is an IP address before calling getaddrinfo(), which can be much slower and work differently on different systems. --- diff --git a/nameserv.c b/nameserv.c index 91624787..81d1af2b 100644 --- a/nameserv.c +++ b/nameserv.c @@ -52,9 +52,22 @@ DNS_Name2IPAddress(const char *name, IPAddr *ip_addrs, int max_addrs) { struct addrinfo hints, *res, *ai; int i, result; + IPAddr ip; max_addrs = MIN(max_addrs, DNS_MAX_ADDRESSES); + for (i = 0; i < max_addrs; i++) + ip_addrs[i].family = IPADDR_UNSPEC; + + /* Avoid calling getaddrinfo() if the name is an IP address */ + if (UTI_StringToIP(name, &ip)) { + if (address_family != IPADDR_UNSPEC && ip.family != address_family) + return DNS_Failure; + if (max_addrs >= 1) + ip_addrs[0] = ip; + return DNS_Success; + } + memset(&hints, 0, sizeof (hints)); switch (address_family) { @@ -106,9 +119,6 @@ DNS_Name2IPAddress(const char *name, IPAddr *ip_addrs, int max_addrs) } } - for (; i < max_addrs; i++) - ip_addrs[i].family = IPADDR_UNSPEC; - freeaddrinfo(res); return !max_addrs || ip_addrs[0].family != IPADDR_UNSPEC ? DNS_Success : DNS_Failure;