]> git.ipfire.org Git - thirdparty/chrony.git/commitdiff
nameserv: avoid unnecessary getaddrinfo() calls
authorMiroslav Lichvar <mlichvar@redhat.com>
Tue, 2 Mar 2021 16:24:09 +0000 (17:24 +0100)
committerMiroslav Lichvar <mlichvar@redhat.com>
Thu, 4 Mar 2021 11:36:36 +0000 (12:36 +0100)
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.

nameserv.c

index 9162478706216c63b1235c194048843ac8ff1278..81d1af2b6650f003805221dc1b65d6b82e408613 100644 (file)
@@ -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;