Commit 90d40aff authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

Revered Ashish Sharma's multiple entries patch, as it caused memory madness

parent 30808dca
Loading
Loading
Loading
Loading
+20 −119
Original line number Diff line number Diff line
@@ -116,7 +116,7 @@ static void next_lookup(struct host_query *hquery)
{
  int status;
  const char *p;
  struct hostent *host = NULL;
  struct hostent *host;

  for (p = hquery->remaining_lookups; *p; p++)
    {
@@ -151,7 +151,7 @@ static void host_callback(void *arg, int status, unsigned char *abuf, int alen)
{
  struct host_query *hquery = (struct host_query *) arg;
  ares_channel channel = hquery->channel;
  struct hostent *host = NULL;
  struct hostent *host;

  if (status == ARES_SUCCESS)
    {
@@ -242,86 +242,12 @@ static int fake_hostent(const char *name, int family, ares_host_callback callbac
  return 1;
}

static int add_host(struct hostent *hostent, struct hostent **host)
{
  char **p;
  char **h_addr_list = NULL;
  struct hostent *hostptr = *host;
  int count = 0;
  int index = 0;

  if (hostptr == NULL)
  {
    *host = hostent;
    return 0;
  }

  for (p = hostptr->h_addr_list; *p; p++)
  {
    count++;
  }

  for (p = hostent->h_addr_list; *p; p++)
  {
    count++;
  }

  h_addr_list = malloc((count+1) * sizeof(char *));
  if (!h_addr_list)
  {
    *host = NULL;
    return -1;
  }

  for (p = hostptr->h_addr_list; *p; p++)
  {
    h_addr_list[index] = malloc(sizeof(struct in_addr));
    if (h_addr_list[index])
    {
      memcpy(h_addr_list[index], *p, sizeof(struct in_addr));
    }
    else
    {
      free(h_addr_list);
      return -1;
    }
    index++;
  }

  for(p = hostent->h_addr_list; *p; p++)
  {
    h_addr_list[index] = malloc(sizeof(struct in_addr));
    if (h_addr_list[index])
    {
      memcpy(h_addr_list[index], *p, sizeof(struct in_addr));
    }
    else
    {
      free(h_addr_list);
      return -1;
    }
    index++;
  }

  h_addr_list[index] = NULL;

  for (p = hostptr->h_addr_list; *p; p++)
  {
    free(*p);
  }
  free(hostptr->h_addr_list);
  hostptr->h_addr_list = h_addr_list;
  return 0;
}

static int file_lookup(const char *name, int family, struct hostent **host)
{
  FILE *fp;
  char **alias;
  int status;
  int error;
  int match;
  struct hostent *hostent = NULL;

#ifdef WIN32
  char PATH_HOSTS[MAX_PATH];
@@ -372,45 +298,20 @@ static int file_lookup(const char *name, int family, struct hostent **host)
    }
  while ((status = ares__get_hostent(fp, family, host)) == ARES_SUCCESS)
    {
      match = 0;
      hostent = *host;
      if (strcasecmp((*host)->h_name, name) == 0)
      {
        match = 1;
      }
      else
      {
        break;
      for (alias = (*host)->h_aliases; *alias; alias++)
        {
          if (strcasecmp(*alias, name) == 0)
          {
            match = 1;
            break;
        }
        }
      }
      if (match)
      {
        if(!add_host(hostent, host))
          ares_free_hostent(hostent);
        else {
          *host = NULL;
        }
      }
      else
      {
      if (*alias)
        break;
      ares_free_hostent(*host);
        *host = NULL;
      }
    }
  fclose(fp);
  if (status == ARES_EOF)
  {
    if ( *host)
      status = ARES_SUCCESS;
    else
    status = ARES_ENOTFOUND;
  }
  if (status != ARES_SUCCESS)
    *host = NULL;
  return status;