Commit 8f068156 authored by unknown's avatar unknown

After-merge fixes.

parents 2f8b0ab3 9df51cf3
...@@ -3591,7 +3591,7 @@ int mysql_drop_user(THD *thd, List <LEX_USER> &list) ...@@ -3591,7 +3591,7 @@ int mysql_drop_user(THD *thd, List <LEX_USER> &list)
int mysql_revoke_all(THD *thd, List <LEX_USER> &list) int mysql_revoke_all(THD *thd, List <LEX_USER> &list)
{ {
uint counter; uint counter, revoked;
int result; int result;
ACL_DB *acl_db; ACL_DB *acl_db;
TABLE_LIST tables[4]; TABLE_LIST tables[4];
...@@ -3624,74 +3624,86 @@ int mysql_revoke_all(THD *thd, List <LEX_USER> &list) ...@@ -3624,74 +3624,86 @@ int mysql_revoke_all(THD *thd, List <LEX_USER> &list)
} }
/* Remove db access privileges */ /* Remove db access privileges */
for (counter= 0 ; counter < acl_dbs.elements ; ) /*
Because acl_dbs and column_priv_hash shrink and may re-order
as privileges are removed, removal occurs in a repeated loop
until no more privileges are revoked.
*/
do
{ {
const char *user,*host; for (counter= 0, revoked= 0 ; counter < acl_dbs.elements ; )
acl_db=dynamic_element(&acl_dbs,counter,ACL_DB*);
if (!(user=acl_db->user))
user= "";
if (!(host=acl_db->host.hostname))
host= "";
if (!strcmp(lex_user->user.str,user) &&
!my_strcasecmp(system_charset_info, lex_user->host.str, host))
{ {
if (!replace_db_table(tables[1].table, acl_db->db, *lex_user, ~0, 1)) const char *user,*host;
{
/* acl_db=dynamic_element(&acl_dbs,counter,ACL_DB*);
Don't increment counter as replace_db_table deleted the if (!(user=acl_db->user))
current element in acl_db's and shifted the higher elements down user= "";
*/ if (!(host=acl_db->host.hostname))
continue; host= "";
}
result= -1; // Something went wrong if (!strcmp(lex_user->user.str,user) &&
!my_strcasecmp(system_charset_info, lex_user->host.str, host))
{
if (!replace_db_table(tables[1].table, acl_db->db, *lex_user, ~0, 1))
{
/*
Don't increment counter as replace_db_table deleted the
current element in acl_dbs.
*/
revoked= 1;
continue;
}
result= -1; // Something went wrong
}
counter++;
} }
counter++; } while (revoked);
}
/* Remove column access */ /* Remove column access */
for (counter= 0 ; counter < column_priv_hash.records ; ) do
{ {
const char *user,*host; for (counter= 0, revoked= 0 ; counter < column_priv_hash.records ; )
GRANT_TABLE *grant_table= (GRANT_TABLE*) hash_element(&column_priv_hash,
counter);
if (!(user=grant_table->user))
user= "";
if (!(host=grant_table->host))
host= "";
if (!strcmp(lex_user->user.str,user) &&
!my_strcasecmp(system_charset_info, lex_user->host.str, host))
{ {
if (replace_table_table(thd,grant_table,tables[2].table,*lex_user, const char *user,*host;
grant_table->db, GRANT_TABLE *grant_table= (GRANT_TABLE*)hash_element(&column_priv_hash,
grant_table->tname, counter);
~0, 0, 1)) if (!(user=grant_table->user))
{ user= "";
result= -1; if (!(host=grant_table->host))
continue; host= "";
}
else if (!strcmp(lex_user->user.str,user) &&
!my_strcasecmp(system_charset_info, lex_user->host.str, host))
{ {
if (!grant_table->cols) if (replace_table_table(thd,grant_table,tables[2].table,*lex_user,
continue; grant_table->db,
List<LEX_COLUMN> columns; grant_table->tname,
if (replace_column_table(grant_table,tables[3].table, *lex_user, ~0, 0, 1))
columns, {
grant_table->db, result= -1;
grant_table->tname, }
~0, 1)) else
result= -1; if (!grant_table->cols)
/* {
Safer to do continue here as replace_table_table changed revoked= 1;
column_priv_hash and we want to test the current element continue;
*/ }
continue; List<LEX_COLUMN> columns;
if (!replace_column_table(grant_table,tables[3].table, *lex_user,
columns,
grant_table->db,
grant_table->tname,
~0, 1))
{
revoked= 1;
continue;
}
result= -1;
}
} }
counter++;
} }
counter++; } while (revoked);
}
} }
VOID(pthread_mutex_unlock(&acl_cache->lock)); VOID(pthread_mutex_unlock(&acl_cache->lock));
......
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