From 2fb6cb5a5a4d7abbde495c9dc4032c7df76e125b Mon Sep 17 00:00:00 2001 From: "msvensson@neptunus.(none)" <> Date: Wed, 28 Dec 2005 09:23:27 +0100 Subject: [PATCH] BUG#15775 "drop user" command does not refresh acl_check_hosts - DROP USER command didn't reload the acl_check_hosts cache causing subsequent connect's via TCP to fail randomly. - 4.1 version --- mysql-test/r/grant2.result | 12 ++++++++++++ mysql-test/t/grant2.test | 33 +++++++++++++++++++++++++++++++++ sql/sql_acl.cc | 16 ++++++++++++---- 3 files changed, 57 insertions(+), 4 deletions(-) diff --git a/mysql-test/r/grant2.result b/mysql-test/r/grant2.result index 6b6bb697306..85963705718 100644 --- a/mysql-test/r/grant2.result +++ b/mysql-test/r/grant2.result @@ -131,3 +131,15 @@ lock table mysql.user write; revoke all on *.* from 'mysqltest_1'@'localhost'; unlock tables; drop user 'mysqltest_1'@'localhost'; +insert into mysql.user (user, host) values +('mysqltest_1', 'host1'), +('mysqltest_2', 'host2'), +('mysqltest_3', 'host3'), +('mysqltest_4', 'host4'), +('mysqltest_5', 'host5'), +('mysqltest_6', 'host6'), +('mysqltest_7', 'host7'); +flush privileges; +drop user mysqltest_3@host3; +drop user mysqltest_1@host1, mysqltest_2@host2, mysqltest_4@host4, +mysqltest_5@host5, mysqltest_6@host6, mysqltest_7@host7; diff --git a/mysql-test/t/grant2.test b/mysql-test/t/grant2.test index cb00c41a0ca..79ea7f70712 100644 --- a/mysql-test/t/grant2.test +++ b/mysql-test/t/grant2.test @@ -206,4 +206,37 @@ drop user 'mysqltest_1'@'localhost'; disconnect con2root; disconnect con3root; +# +# Bug #15775: "drop user" command does not refresh acl_check_hosts +# + +# Create some test users +insert into mysql.user (user, host) values + ('mysqltest_1', 'host1'), + ('mysqltest_2', 'host2'), + ('mysqltest_3', 'host3'), + ('mysqltest_4', 'host4'), + ('mysqltest_5', 'host5'), + ('mysqltest_6', 'host6'), + ('mysqltest_7', 'host7'); +flush privileges; + +# Drop one user +drop user mysqltest_3@host3; + +# This connect failed before fix since the acl_check_hosts list was corrupted by the "drop user" +connect (con8,127.0.0.1,root,,test,$MASTER_MYPORT,); +disconnect con8; +connection default; + +# Clean up - Drop all of the remaining users at once +drop user mysqltest_1@host1, mysqltest_2@host2, mysqltest_4@host4, + mysqltest_5@host5, mysqltest_6@host6, mysqltest_7@host7; + +# Check that it's still possible to connect +connect (con9,127.0.0.1,root,,test,$MASTER_MYPORT,); +disconnect con9; +connection default; + + # End of 4.1 tests diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc index 1ade6ce3064..0ee83424d9f 100644 --- a/sql/sql_acl.cc +++ b/sql/sql_acl.cc @@ -1151,7 +1151,7 @@ static void init_check_host(void) if (j == acl_wild_hosts.elements) // If new (void) push_dynamic(&acl_wild_hosts,(char*) &acl_user->host); } - else if (!hash_search(&acl_check_hosts,(byte*) &acl_user->host, + else if (!hash_search(&acl_check_hosts,(byte*) acl_user->host.hostname, (uint) strlen(acl_user->host.hostname))) { if (my_hash_insert(&acl_check_hosts,(byte*) acl_user)) @@ -3719,17 +3719,25 @@ int mysql_drop_user(THD *thd, List &list) record[0]))) { tables[0].table->file->print_error(error, MYF(0)); - DBUG_RETURN(-1); + result= -1; + goto end; } delete_dynamic_element(&acl_users, acl_userd); } } + if (result) + my_error(ER_DROP_USER, MYF(0)); + +end: + /* Reload acl_check_hosts as its memory is mapped to acl_user */ + delete_dynamic(&acl_wild_hosts); + hash_free(&acl_check_hosts); + init_check_host(); + VOID(pthread_mutex_unlock(&acl_cache->lock)); rw_unlock(&LOCK_grant); close_thread_tables(thd); - if (result) - my_error(ER_DROP_USER, MYF(0)); DBUG_RETURN(result); }