Commit 93bedc1f authored by unknown's avatar unknown

Bug #15775 "drop user" command does not refresh acl_check_hosts

 - Update patch for 5.0 
 - Added common function to be called when 'acl_users' has been modified


mysql-test/r/grant2.result:
  Use "create user" to avoid warnings about missing fields
mysql-test/t/grant2.test:
  Use "create user" to avoid warnings about missing fields
sql/sql_acl.cc:
  Add new function "rebuild_check_host" that is to be called when the 'acl_users'
  list has changed.
  Call function "rebuild_check_host" from mysql_drop_user, mysql_rename_user and acl_insert_user.
  Use "acl_user->host.hostname" as key when searching the acl_check_hosts in init_check_host.
parent 50545a18
...@@ -107,14 +107,13 @@ delete from mysql.columns_priv where user like 'mysqltest\_%'; ...@@ -107,14 +107,13 @@ delete from mysql.columns_priv where user like 'mysqltest\_%';
flush privileges; flush privileges;
drop database mysqltest; drop database mysqltest;
use test; use test;
insert into mysql.user (user, host) values create user mysqltest_1@host1;
('mysqltest_1', 'host1'), create user mysqltest_2@host2;
('mysqltest_2', 'host2'), create user mysqltest_3@host3;
('mysqltest_3', 'host3'), create user mysqltest_4@host4;
('mysqltest_4', 'host4'), create user mysqltest_5@host5;
('mysqltest_5', 'host5'), create user mysqltest_6@host6;
('mysqltest_6', 'host6'), create user mysqltest_7@host7;
('mysqltest_7', 'host7');
flush privileges; flush privileges;
drop user mysqltest_3@host3; drop user mysqltest_3@host3;
drop user mysqltest_1@host1, mysqltest_2@host2, mysqltest_4@host4, drop user mysqltest_1@host1, mysqltest_2@host2, mysqltest_4@host4,
......
...@@ -161,14 +161,13 @@ use test; ...@@ -161,14 +161,13 @@ use test;
# #
# Create some test users # Create some test users
insert into mysql.user (user, host) values create user mysqltest_1@host1;
('mysqltest_1', 'host1'), create user mysqltest_2@host2;
('mysqltest_2', 'host2'), create user mysqltest_3@host3;
('mysqltest_3', 'host3'), create user mysqltest_4@host4;
('mysqltest_4', 'host4'), create user mysqltest_5@host5;
('mysqltest_5', 'host5'), create user mysqltest_6@host6;
('mysqltest_6', 'host6'), create user mysqltest_7@host7;
('mysqltest_7', 'host7');
flush privileges; flush privileges;
# Drop one user # Drop one user
......
...@@ -68,6 +68,7 @@ static ulong get_access(TABLE *form,uint fieldnr, uint *next_field=0); ...@@ -68,6 +68,7 @@ static ulong get_access(TABLE *form,uint fieldnr, uint *next_field=0);
static int acl_compare(ACL_ACCESS *a,ACL_ACCESS *b); static int acl_compare(ACL_ACCESS *a,ACL_ACCESS *b);
static ulong get_sort(uint count,...); static ulong get_sort(uint count,...);
static void init_check_host(void); static void init_check_host(void);
static void rebuild_check_host(void);
static ACL_USER *find_acl_user(const char *host, const char *user, static ACL_USER *find_acl_user(const char *host, const char *user,
my_bool exact); my_bool exact);
static bool update_user_table(THD *thd, TABLE *table, static bool update_user_table(THD *thd, TABLE *table,
...@@ -1095,10 +1096,8 @@ static void acl_insert_user(const char *user, const char *host, ...@@ -1095,10 +1096,8 @@ static void acl_insert_user(const char *user, const char *host,
qsort((gptr) dynamic_element(&acl_users,0,ACL_USER*),acl_users.elements, qsort((gptr) dynamic_element(&acl_users,0,ACL_USER*),acl_users.elements,
sizeof(ACL_USER),(qsort_cmp) acl_compare); sizeof(ACL_USER),(qsort_cmp) acl_compare);
/* We must free acl_check_hosts as its memory is mapped to acl_user */ /* Rebuild 'acl_check_hosts' since 'acl_users' has been modified */
delete_dynamic(&acl_wild_hosts); rebuild_check_host();
hash_free(&acl_check_hosts);
init_check_host();
} }
...@@ -1283,7 +1282,7 @@ static void init_check_host(void) ...@@ -1283,7 +1282,7 @@ static void init_check_host(void)
if (j == acl_wild_hosts.elements) // If new if (j == acl_wild_hosts.elements) // If new
(void) push_dynamic(&acl_wild_hosts,(char*) &acl_user->host); (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))) (uint) strlen(acl_user->host.hostname)))
{ {
if (my_hash_insert(&acl_check_hosts,(byte*) acl_user)) if (my_hash_insert(&acl_check_hosts,(byte*) acl_user))
...@@ -1300,6 +1299,22 @@ static void init_check_host(void) ...@@ -1300,6 +1299,22 @@ static void init_check_host(void)
} }
/*
Rebuild lists used for checking of allowed hosts
We need to rebuild 'acl_check_hosts' and 'acl_wild_hosts' after adding,
dropping or renaming user, since they contain pointers to elements of
'acl_user' array, which are invalidated by drop operation, and use
ACL_USER::host::hostname as a key, which is changed by rename.
*/
void rebuild_check_host(void)
{
delete_dynamic(&acl_wild_hosts);
hash_free(&acl_check_hosts);
init_check_host();
}
/* Return true if there is no users that can match the given host */ /* Return true if there is no users that can match the given host */
bool acl_check_host(const char *host, const char *ip) bool acl_check_host(const char *host, const char *ip)
...@@ -5241,6 +5256,9 @@ bool mysql_drop_user(THD *thd, List <LEX_USER> &list) ...@@ -5241,6 +5256,9 @@ bool mysql_drop_user(THD *thd, List <LEX_USER> &list)
} }
} }
/* Rebuild 'acl_check_hosts' since 'acl_users' has been modified */
rebuild_check_host();
VOID(pthread_mutex_unlock(&acl_cache->lock)); VOID(pthread_mutex_unlock(&acl_cache->lock));
rw_unlock(&LOCK_grant); rw_unlock(&LOCK_grant);
close_thread_tables(thd); close_thread_tables(thd);
...@@ -5265,7 +5283,7 @@ bool mysql_drop_user(THD *thd, List <LEX_USER> &list) ...@@ -5265,7 +5283,7 @@ bool mysql_drop_user(THD *thd, List <LEX_USER> &list)
bool mysql_rename_user(THD *thd, List <LEX_USER> &list) bool mysql_rename_user(THD *thd, List <LEX_USER> &list)
{ {
int result= 0; int result;
String wrong_users; String wrong_users;
LEX_USER *user_from; LEX_USER *user_from;
LEX_USER *user_to; LEX_USER *user_to;
...@@ -5297,6 +5315,9 @@ bool mysql_rename_user(THD *thd, List <LEX_USER> &list) ...@@ -5297,6 +5315,9 @@ bool mysql_rename_user(THD *thd, List <LEX_USER> &list)
} }
} }
/* Rebuild 'acl_check_hosts' since 'acl_users' has been modified */
rebuild_check_host();
VOID(pthread_mutex_unlock(&acl_cache->lock)); VOID(pthread_mutex_unlock(&acl_cache->lock));
rw_unlock(&LOCK_grant); rw_unlock(&LOCK_grant);
close_thread_tables(thd); close_thread_tables(thd);
......
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