diff options
| author | Steinar H. Gunderson <sesse@google.com> | 2007-09-29 13:52:14 +0000 | 
|---|---|---|
| committer | Steinar H. Gunderson <sesse@google.com> | 2007-09-29 13:52:14 +0000 | 
| commit | 9fc66e4dd966f18a8dbe7f251ab2a791dc8b8f23 (patch) | |
| tree | d8ce46a06418fdf3545fc631874340229f22dc1b | |
| parent | 6ecea9453ba158edb1949dcac2fc46e1ad4b5bf2 (diff) | |
Be stricter about what's a valid IP address in fake_hostent. (Patch from the Google tree.)
| -rw-r--r-- | ares/ares_gethostbyname.c | 22 | 
1 files changed, 21 insertions, 1 deletions
| diff --git a/ares/ares_gethostbyname.c b/ares/ares_gethostbyname.c index 49ae53ed3..7a4aad6e3 100644 --- a/ares/ares_gethostbyname.c +++ b/ares/ares_gethostbyname.c @@ -209,7 +209,27 @@ static int fake_hostent(const char *name, int family, ares_host_callback callbac    struct in6_addr in6;    if (family == AF_INET) -    result = ((in.s_addr = inet_addr(name)) == INADDR_NONE ? 0 : 1); +    { +      /* It only looks like an IP address if it's all numbers and dots. */ +      int numdots = 0; +      const char *p; +      for (p = name; *p; p++) +        { +          if (!isdigit(*p) && *p != '.') { +            return 0; +          } else if (*p == '.') { +            numdots++; +          } +        } +     +      /* if we don't have 3 dots, it is illegal  +       * (although inet_addr doesn't think so). +       */ +      if (numdots != 3) +        result = 0; +      else +        result = ((in.s_addr = inet_addr(name)) == INADDR_NONE ? 0 : 1); +    }    else if (family == AF_INET6)      result = (ares_inet_pton(AF_INET6, name, &in6) < 1 ? 0 : 1); | 
