Commit a59a4441 authored by unknown's avatar unknown
Browse files

Backport of JimW's localhost patch to 4.1 tree.

Handle systems like default FC4 where 127.0.0.1 doesn't always map to 'localhost' first. 
(Bug #11822)


sql/hostname.cc:
  Short-circuit ip_to_hostname() lookup for INADDR_LOOPBACK to allways return 'localhost'.
sql/sql_parse.cc:
  Push special handling of 127.0.0.1 into ip_to_hostname().
parent cbb1da77
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -130,15 +130,23 @@ void reset_host_errors(struct in_addr *in)
  VOID(pthread_mutex_unlock(&hostname_cache->lock));
}

/* Deal with systems that don't defined INADDR_LOOPBACK */
#ifndef INADDR_LOOPBACK
#define INADDR_LOOPBACK 0x7f000001UL
#endif

my_string ip_to_hostname(struct in_addr *in, uint *errors)
{
  uint i;
  host_entry *entry;
  DBUG_ENTER("ip_to_hostname");
  *errors= 0;

  /* We always treat the loopback address as "localhost". */
  if (in->s_addr == htonl(INADDR_LOOPBACK))
    DBUG_RETURN((char *)my_localhost);

  /* Check first if we have name in cache */
  *errors=0;
  if (!(specialflag & SPECIAL_NO_HOST_CACHE))
  {
    VOID(pthread_mutex_lock(&hostname_cache->lock));
+10 −20
Original line number Diff line number Diff line
@@ -696,16 +696,6 @@ static int check_connection(THD *thd)
      return (ER_OUT_OF_RESOURCES);
    thd->host_or_ip= thd->ip;
    vio_in_addr(net->vio,&thd->remote.sin_addr);
#if !defined(HAVE_SYS_UN_H) || defined(HAVE_mit_thread)
    /* Fast local hostname resolve for Win32 */
    if (!strcmp(thd->ip,"127.0.0.1"))
    {
      thd->host= (char*) my_localhost;
      thd->host_or_ip= my_localhost;
    }
    else
#endif
    {
    if (!(specialflag & SPECIAL_NO_RESOLVE))
    {
      vio_in_addr(net->vio,&thd->remote.sin_addr);
@@ -713,13 +703,13 @@ static int check_connection(THD *thd)
      /* Cut very long hostnames to avoid possible overflows */
      if (thd->host)
      {
        if (thd->host != my_localhost)
          thd->host[min(strlen(thd->host), HOSTNAME_LENGTH)]= 0;
        thd->host_or_ip= thd->host;
      }
      if (connect_errors > max_connect_errors)
        return(ER_HOST_IS_BLOCKED);
    }
    }
    DBUG_PRINT("info",("Host: %s  ip: %s",
		       thd->host ? thd->host : "unknown host",
		       thd->ip ? thd->ip : "unknown ip"));