Commit 788a2658 authored by monty@mysql.com's avatar monty@mysql.com

Better bug fix for #5569: "Incorrect "Access Denied" error with SAME login DIFFERENT host"

This fixes also the reverse lookup bug introduced by the previous patch
parent 548f7dba
...@@ -455,4 +455,3 @@ select min(a) is null from t1; ...@@ -455,4 +455,3 @@ select min(a) is null from t1;
select min(a) is null or null from t1; select min(a) is null or null from t1;
select 1 and min(a) is null from t1; select 1 and min(a) is null from t1;
drop table t1; drop table t1;
...@@ -504,8 +504,6 @@ check_connections(THD *thd) ...@@ -504,8 +504,6 @@ check_connections(THD *thd)
DBUG_PRINT("info",("New connection received on %s", DBUG_PRINT("info",("New connection received on %s",
vio_description(net->vio))); vio_description(net->vio)));
vio_in_addr(net->vio,&thd->remote.sin_addr);
if (!thd->host) // If TCP/IP connection if (!thd->host) // If TCP/IP connection
{ {
char ip[30]; char ip[30];
...@@ -515,6 +513,7 @@ check_connections(THD *thd) ...@@ -515,6 +513,7 @@ check_connections(THD *thd)
if (!(thd->ip = my_strdup(ip,MYF(0)))) if (!(thd->ip = my_strdup(ip,MYF(0))))
return (ER_OUT_OF_RESOURCES); return (ER_OUT_OF_RESOURCES);
thd->host_or_ip=thd->ip; 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) #if !defined(HAVE_SYS_UN_H) || defined(HAVE_mit_thread)
/* Fast local hostname resolve for Win32 */ /* Fast local hostname resolve for Win32 */
if (!strcmp(thd->ip,"127.0.0.1")) if (!strcmp(thd->ip,"127.0.0.1"))
...@@ -524,17 +523,19 @@ check_connections(THD *thd) ...@@ -524,17 +523,19 @@ check_connections(THD *thd)
} }
else else
#endif #endif
if (!(specialflag & SPECIAL_NO_RESOLVE))
{ {
thd->host=ip_to_hostname(&thd->remote.sin_addr,&connect_errors); if (!(specialflag & SPECIAL_NO_RESOLVE))
/* Cut very long hostnames to avoid possible overflows */
if (thd->host)
{ {
thd->host[min(strlen(thd->host), HOSTNAME_LENGTH)]= 0; thd->host=ip_to_hostname(&thd->remote.sin_addr,&connect_errors);
thd->host_or_ip= thd->host; /* Cut very long hostnames to avoid possible overflows */
if (thd->host)
{
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);
} }
if (connect_errors > max_connect_errors)
return(ER_HOST_IS_BLOCKED);
} }
DBUG_PRINT("info",("Host: %s ip: %s", DBUG_PRINT("info",("Host: %s ip: %s",
thd->host ? thd->host : "unknown host", thd->host ? thd->host : "unknown host",
...@@ -547,6 +548,8 @@ check_connections(THD *thd) ...@@ -547,6 +548,8 @@ check_connections(THD *thd)
DBUG_PRINT("info",("Host: %s",thd->host)); DBUG_PRINT("info",("Host: %s",thd->host));
thd->host_or_ip= thd->host; thd->host_or_ip= thd->host;
thd->ip= 0; thd->ip= 0;
/* Reset sin_addr */
bzero((char*) &thd->remote, sizeof(thd->remote));
} }
vio_keepalive(net->vio, TRUE); vio_keepalive(net->vio, TRUE);
......
...@@ -291,6 +291,18 @@ my_bool vio_peer_addr(Vio * vio, char *buf, uint16 *port) ...@@ -291,6 +291,18 @@ my_bool vio_peer_addr(Vio * vio, char *buf, uint16 *port)
} }
/*
Get in_addr for a TCP/IP connection
SYNOPSIS
vio_in_addr()
vio vio handle
in put in_addr here
NOTES
one must call vio_peer_addr() before calling this one
*/
void vio_in_addr(Vio *vio, struct in_addr *in) void vio_in_addr(Vio *vio, struct in_addr *in)
{ {
DBUG_ENTER("vio_in_addr"); DBUG_ENTER("vio_in_addr");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment