From: Alexander Nozdrin Date: June 11 2009 7:07am Subject: bzr commit into mysql-5.4 branch (alik:2798) Bug#38247 List-Archive: http://lists.mysql.com/commits/76095 X-Bug: 38247 Message-Id: <20090611070707.C110E7FC65@quad> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="Boundary_(ID_Yb+JXiGNSqiPG33zpKklqw)" --Boundary_(ID_Yb+JXiGNSqiPG33zpKklqw) MIME-version: 1.0 Content-type: text/plain; CHARSET=US-ASCII Content-transfer-encoding: 7BIT Content-disposition: inline #At file:///mnt/raid/alik/MySQL/bzr/bug38247/azalea-bf-bug38247.2/ based on revid:alik@stripped 2798 Alexander Nozdrin 2009-06-11 Fix one symptom of Bug#38247 (Server does not resolve connecting ip's). This patch fixes the main complaint of Bug#38247, which is the server does not resolve host names. Technically, this patch fixes two problems: - a second getnameinfo() call is needed to retrieve actual host name, not an IP address as a string. - normalize_ip_address() has been introduced in order to be able to compare IPv4 and IPv6 addresses. modified: mysql-test/r/connect.result mysql-test/t/connect.test sql/hostname.cc === modified file 'mysql-test/r/connect.result' --- a/mysql-test/r/connect.result 2009-03-06 20:33:52 +0000 +++ b/mysql-test/r/connect.result 2009-06-11 07:06:55 +0000 @@ -224,3 +224,14 @@ SET GLOBAL event_scheduler = OFF; # ------------------------------------------------------------------ # -- End of 5.1 tests # ------------------------------------------------------------------ + +# -- Bug#38247: Server does not resolve connecting ip's. + +GRANT ALL PRIVILEGES ON *.* TO u1@quad; +GRANT ALL PRIVILEGES ON *.* TO u2@stripped; +SELECT 1; +DROP USER u1@quad; +DROP USER u2@stripped; + +# -- End of Bug#38247. + === modified file 'mysql-test/t/connect.test' --- a/mysql-test/t/connect.test 2009-03-06 14:56:17 +0000 +++ b/mysql-test/t/connect.test 2009-06-11 07:06:55 +0000 @@ -296,6 +296,58 @@ SET GLOBAL event_scheduler = OFF; --echo # -- End of 5.1 tests --echo # ------------------------------------------------------------------ +########################################################################### + +--echo +--echo # -- Bug#38247: Server does not resolve connecting ip's. +--echo + +let $hostname_file= $MYSQLTEST_VARDIR/tmp/bug38247.include; + +perl; +use Sys::Hostname; +use Socket; + +my $hostname= hostname(); +my $ip_address= inet_ntoa(scalar gethostbyname($hostname)); + +my $file= $ENV{'MYSQLTEST_VARDIR'} . '/tmp/bug38247.include'; + +open FH, "> $file"; +print FH "let \$hostname= $hostname;"; +print FH "let \$ip_address= $ip_address;"; +close FH; +EOF + +source $hostname_file; +remove_file $hostname_file; + +eval GRANT ALL PRIVILEGES ON *.* TO u1@$hostname; +eval GRANT ALL PRIVILEGES ON *.* TO u2@$ip_address; + +--connect(con1,$hostname,u1,,test,,) +--disable_result_log +SELECT 1; +--enable_result_log +--disconnect con1 + +# +# This is disabled due to another symptom of Bug#38247. +# +# --connect(con2,$ip_address,u2,,test,,) +# --disable_result_log +# SELECT 1; +# --enable_result_log +# --disconnect con2 + +--connection default +eval DROP USER u1@$hostname; +eval DROP USER u2@$ip_address; + +--echo +--echo # -- End of Bug#38247. +--echo + # Wait till all disconnects are completed --source include/wait_until_count_sessions.inc === modified file 'sql/hostname.cc' --- a/sql/hostname.cc 2009-01-27 02:08:48 +0000 +++ b/sql/hostname.cc 2009-06-11 07:06:55 +0000 @@ -40,6 +40,64 @@ extern "C" { // Because of SCO 3.2V4 } #endif +/************************************************************************* + *** The functions below are defined in the ws2ipdef.h header file. + *** However, they are enabled only starting from WindowsXP. MySQL is + *** supported starting from Windows 2000, that's why we need to have them + *** defined manually here. +**************************************************************************/ +#if defined(__WIN__) && defined(_WIN32_WINNT) && _WIN32_WINNT <= 0x0500 + +WS2TCPIP_INLINE +BOOLEAN +IN6_IS_ADDR_LOOPBACK(CONST IN6_ADDR *a) +{ + /* + We can't use the in6addr_loopback variable, since that would + require existing callers to link with a specific library. + */ + + return (BOOLEAN)((a->s6_words[0] == 0) && + (a->s6_words[1] == 0) && + (a->s6_words[2] == 0) && + (a->s6_words[3] == 0) && + (a->s6_words[4] == 0) && + (a->s6_words[5] == 0) && + (a->s6_words[6] == 0) && + (a->s6_words[7] == 0x0100)); +} + +WS2TCPIP_INLINE +BOOLEAN +IN6_IS_ADDR_V4MAPPED(CONST IN6_ADDR *a) +{ + return (BOOLEAN)((a->s6_words[0] == 0) && + (a->s6_words[1] == 0) && + (a->s6_words[2] == 0) && + (a->s6_words[3] == 0) && + (a->s6_words[4] == 0) && + (a->s6_words[5] == 0xffff)); +} + +WS2TCPIP_INLINE +BOOLEAN +IN6_IS_ADDR_V4COMPAT(CONST IN6_ADDR *a) +{ + return (BOOLEAN)((a->s6_words[0] == 0) && + (a->s6_words[1] == 0) && + (a->s6_words[2] == 0) && + (a->s6_words[3] == 0) && + (a->s6_words[4] == 0) && + (a->s6_words[5] == 0) && + !((a->s6_words[6] == 0) && + (a->s6_addr[14] == 0) && + ((a->s6_addr[15] == 0) || (a->s6_addr[15] == 1)))); +} + +#endif + +/************************************************************************/ + class host_entry :public hash_filo_element { public: @@ -134,8 +192,80 @@ void reset_host_errors(struct sockaddr_s } +/** + Normalize the IP address of a client. + + When IPv4 and IPv6 are both used in the network stack, + or in the network path between a client and a server, + a client can have different apparent IP addresses, + based on the exact route taken. + This function normalize the client IP representation, + so it's suitable to use as a key for searches. + Transformations are implemented as follows: + - IPv4 a.b.c.d --> IPv6 mapped IPv4 ::ffff:a.b.c.d + - IPv6 compat IPv4 ::a.b.c.d --> IPv6 mapped IPv4 ::ffff:a.b.c.d + - IPv6 --> IPv6 + + @param [in] in_address IP address to be normalized + @param [out] normalized_address Normalized IP address + + @note According to RFC3493 the only specified member of the in6_addr + structure is s6_addr. +*/ +static void normalize_ip_address(struct sockaddr *in_address, + struct in6_addr *normalized_address) +{ + uint32 *out_s6_addr32= (uint32 *) normalized_address->s6_addr; + + switch (in_address->sa_family){ + case AF_INET: + { + struct in_addr *inp_addr4= & ((struct sockaddr_in*)in_address)->sin_addr; + + out_s6_addr32[0]= 0; + out_s6_addr32[1]= 0; + out_s6_addr32[2]= htonl(0xffff); + out_s6_addr32[3]= inp_addr4->s_addr; /* in net byte order */ + + DBUG_ASSERT(IN6_IS_ADDR_V4MAPPED(normalized_address)); + break; + } + + case AF_INET6: + { + struct in6_addr *inp_addr6= & ((struct sockaddr_in6*)in_address)->sin6_addr; + uint32 *inp_s6_addr32= (uint32 *) inp_addr6->s6_addr; + + if (IN6_IS_ADDR_V4COMPAT(inp_addr6)) + { + out_s6_addr32[0]= 0; + out_s6_addr32[1]= 0; + out_s6_addr32[2]= htonl(0xffff); + out_s6_addr32[3]= inp_s6_addr32[3]; /* in net byte order */ + DBUG_ASSERT(IN6_IS_ADDR_V4MAPPED(normalized_address)); + } + else + { + /* All in net byte order */ + out_s6_addr32[0]= inp_s6_addr32[0]; + out_s6_addr32[1]= inp_s6_addr32[1]; + out_s6_addr32[2]= inp_s6_addr32[2]; + out_s6_addr32[3]= inp_s6_addr32[3]; + } + + break; + } + + default: + DBUG_ASSERT(FALSE); + break; + } +} + + char *ip_to_hostname(struct sockaddr_storage *in, int addrLen, uint *errors) { + struct in6_addr in_normalized; char *name; struct addrinfo hints,*res_lst,*t_res; @@ -146,7 +276,12 @@ char *ip_to_hostname(struct sockaddr_sto DBUG_ENTER("ip_to_hostname"); *errors=0; - /* Historical comparison for 127.0.0.1 */ + /* + Historical comparison for 127.0.0.1. + + Call getnameinfo() with NI_NUMERICHOST, which means, it will return IP + address as a string. + */ gxi_error= getnameinfo((struct sockaddr *)in, addrLen, hostname_buff, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); @@ -155,7 +290,7 @@ char *ip_to_hostname(struct sockaddr_sto DBUG_PRINT("error",("getnameinfo returned %d", gxi_error)); DBUG_RETURN(0); } - DBUG_PRINT("info",("resolved: %s", hostname_buff)); + DBUG_PRINT("info",("Client IP address: %s", hostname_buff)); /* The next three compares are to solve historical solutions with localhost */ if (!memcmp(hostname_buff, "127.0.0.1", sizeof("127.0.0.1"))) @@ -190,6 +325,18 @@ char *ip_to_hostname(struct sockaddr_sto pthread_mutex_unlock(&hostname_cache->lock); } + /* Resolve host name. */ + + gxi_error= getnameinfo((struct sockaddr *)in, addrLen, + hostname_buff, NI_MAXHOST, + NULL, 0, 0); + if (gxi_error) + { + DBUG_PRINT("error",("getnameinfo returned %d", gxi_error)); + DBUG_RETURN(0); + } + DBUG_PRINT("info",("Client host name: %s", hostname_buff)); + if (!(name= my_strdup(hostname_buff, MYF(0)))) { DBUG_PRINT("error",("out of memory")); @@ -240,10 +387,16 @@ char *ip_to_hostname(struct sockaddr_sto } /* Check that 'getaddrinfo' returned the used ip */ + + normalize_ip_address((struct sockaddr *) in, &in_normalized); + for (t_res= res_lst; t_res; t_res=t_res->ai_next) { - if (!memcmp(&(t_res->ai_addr), in, - sizeof(struct sockaddr_storage) ) ) + struct in6_addr t_res_normalized; + normalize_ip_address(t_res->ai_addr, &t_res_normalized); + + if (!memcmp(&in_normalized, &t_res_normalized, + sizeof (in6_addr))) { add_hostname(in, name); freeaddrinfo(res_lst); --Boundary_(ID_Yb+JXiGNSqiPG33zpKklqw) MIME-version: 1.0 Content-type: text/bzr-bundle; CHARSET=US-ASCII; name="bzr/alik@stripped" Content-transfer-encoding: 7BIT Content-disposition: inline; filename="bzr/alik@stripped" # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: alik@stripped # target_branch: file:///mnt/raid/alik/MySQL/bzr/bug38247/azalea-bf-\ # bug38247.2/ # testament_sha1: 9c9c8e8a78b4f2efc3688e539bf8b47bfe794751 # timestamp: 2009-06-11 11:07:07 +0400 # base_revision_id: alik@stripped # # Begin bundle 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 59hkZjS/xdyRThQkJOx03kA= --Boundary_(ID_Yb+JXiGNSqiPG33zpKklqw)--