From 8d1e46bdcc2ae631d3f120e47413c5dc3d8da070 Mon Sep 17 00:00:00 2001
From: "Steinar H. Gunderson" <sesse@google.com>
Date: Thu, 27 Aug 2009 09:53:55 +0000
Subject: [PATCH] Support lookup of IPv4 literals in ares_gethostbyname(), even
 when the address family is set to AF_INET6.

---
 ares/ares_gethostbyname.c | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/ares/ares_gethostbyname.c b/ares/ares_gethostbyname.c
index 1ef25c7a56..d708dfb141 100644
--- a/ares/ares_gethostbyname.c
+++ b/ares/ares_gethostbyname.c
@@ -245,15 +245,16 @@ static int fake_hostent(const char *name, int family, ares_host_callback callbac
   struct in_addr in;
   struct in6_addr in6;
 
-  if (family == AF_INET)
+  if (family == AF_INET || family == AF_INET6)
     {
       /* It only looks like an IP address if it's all numbers and dots. */
-      int numdots = 0;
+      int numdots = 0, valid = 1;
       const char *p;
       for (p = name; *p; p++)
         {
           if (!ISDIGIT(*p) && *p != '.') {
-            return 0;
+            valid = 0;
+            break;
           } else if (*p == '.') {
             numdots++;
           }
@@ -262,12 +263,15 @@ static int fake_hostent(const char *name, int family, ares_host_callback callbac
       /* if we don't have 3 dots, it is illegal
        * (although inet_addr doesn't think so).
        */
-      if (numdots != 3)
+      if (numdots != 3 || !valid)
         result = 0;
       else
         result = ((in.s_addr = inet_addr(name)) == INADDR_NONE ? 0 : 1);
+
+      if (result)
+        family = AF_INET;
     }
-  else if (family == AF_INET6)
+  if (family == AF_INET6)
     result = (ares_inet_pton(AF_INET6, name, &in6) < 1 ? 0 : 1);
 
   if (!result)
-- 
GitLab