mirror of
https://github.com/MariaDB/server.git
synced 2025-01-17 12:32:27 +01:00
5.0-bugteam->5.1-bugteam merge
This commit is contained in:
commit
25fc844f5f
1 changed files with 85 additions and 36 deletions
121
sql/sql_acl.cc
121
sql/sql_acl.cc
|
@ -6304,10 +6304,11 @@ int wild_case_compare(CHARSET_INFO *cs, const char *str,const char *wildstr)
|
|||
}
|
||||
|
||||
|
||||
void update_schema_privilege(TABLE *table, char *buff, const char* db,
|
||||
const char* t_name, const char* column,
|
||||
uint col_length, const char *priv,
|
||||
uint priv_length, const char* is_grantable)
|
||||
static bool update_schema_privilege(THD *thd, TABLE *table, char *buff,
|
||||
const char* db, const char* t_name,
|
||||
const char* column, uint col_length,
|
||||
const char *priv, uint priv_length,
|
||||
const char* is_grantable)
|
||||
{
|
||||
int i= 2;
|
||||
CHARSET_INFO *cs= system_charset_info;
|
||||
|
@ -6320,14 +6321,15 @@ void update_schema_privilege(TABLE *table, char *buff, const char* db,
|
|||
if (column)
|
||||
table->field[i++]->store(column, col_length, cs);
|
||||
table->field[i++]->store(priv, priv_length, cs);
|
||||
table->field[i]->store(is_grantable, (uint) strlen(is_grantable), cs);
|
||||
table->file->ha_write_row(table->record[0]);
|
||||
table->field[i]->store(is_grantable, strlen(is_grantable), cs);
|
||||
return schema_table_store_record(thd, table);
|
||||
}
|
||||
|
||||
|
||||
int fill_schema_user_privileges(THD *thd, TABLE_LIST *tables, COND *cond)
|
||||
{
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
int error= 0;
|
||||
uint counter;
|
||||
ACL_USER *acl_user;
|
||||
ulong want_access;
|
||||
|
@ -6361,8 +6363,14 @@ int fill_schema_user_privileges(THD *thd, TABLE_LIST *tables, COND *cond)
|
|||
|
||||
strxmov(buff,"'",user,"'@'",host,"'",NullS);
|
||||
if (!(want_access & ~GRANT_ACL))
|
||||
update_schema_privilege(table, buff, 0, 0, 0, 0,
|
||||
STRING_WITH_LEN("USAGE"), is_grantable);
|
||||
{
|
||||
if (update_schema_privilege(thd, table, buff, 0, 0, 0, 0,
|
||||
STRING_WITH_LEN("USAGE"), is_grantable))
|
||||
{
|
||||
error= 1;
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
uint priv_id;
|
||||
|
@ -6370,16 +6378,22 @@ int fill_schema_user_privileges(THD *thd, TABLE_LIST *tables, COND *cond)
|
|||
for (priv_id=0, j = SELECT_ACL;j <= GLOBAL_ACLS; priv_id++,j <<= 1)
|
||||
{
|
||||
if (test_access & j)
|
||||
update_schema_privilege(table, buff, 0, 0, 0, 0,
|
||||
command_array[priv_id],
|
||||
command_lengths[priv_id], is_grantable);
|
||||
{
|
||||
if (update_schema_privilege(thd, table, buff, 0, 0, 0, 0,
|
||||
command_array[priv_id],
|
||||
command_lengths[priv_id], is_grantable))
|
||||
{
|
||||
error= 1;
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
err:
|
||||
pthread_mutex_unlock(&acl_cache->lock);
|
||||
|
||||
DBUG_RETURN(0);
|
||||
DBUG_RETURN(error);
|
||||
#else
|
||||
return(0);
|
||||
#endif
|
||||
|
@ -6389,6 +6403,7 @@ int fill_schema_user_privileges(THD *thd, TABLE_LIST *tables, COND *cond)
|
|||
int fill_schema_schema_privileges(THD *thd, TABLE_LIST *tables, COND *cond)
|
||||
{
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
int error= 0;
|
||||
uint counter;
|
||||
ACL_DB *acl_db;
|
||||
ulong want_access;
|
||||
|
@ -6426,24 +6441,36 @@ int fill_schema_schema_privileges(THD *thd, TABLE_LIST *tables, COND *cond)
|
|||
}
|
||||
strxmov(buff,"'",user,"'@'",host,"'",NullS);
|
||||
if (!(want_access & ~GRANT_ACL))
|
||||
update_schema_privilege(table, buff, acl_db->db, 0, 0,
|
||||
0, STRING_WITH_LEN("USAGE"), is_grantable);
|
||||
{
|
||||
if (update_schema_privilege(thd, table, buff, acl_db->db, 0, 0,
|
||||
0, STRING_WITH_LEN("USAGE"), is_grantable))
|
||||
{
|
||||
error= 1;
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
int cnt;
|
||||
ulong j,test_access= want_access & ~GRANT_ACL;
|
||||
for (cnt=0, j = SELECT_ACL; j <= DB_ACLS; cnt++,j <<= 1)
|
||||
if (test_access & j)
|
||||
update_schema_privilege(table, buff, acl_db->db, 0, 0, 0,
|
||||
command_array[cnt], command_lengths[cnt],
|
||||
is_grantable);
|
||||
{
|
||||
if (update_schema_privilege(thd, table, buff, acl_db->db, 0, 0, 0,
|
||||
command_array[cnt], command_lengths[cnt],
|
||||
is_grantable))
|
||||
{
|
||||
error= 1;
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
err:
|
||||
pthread_mutex_unlock(&acl_cache->lock);
|
||||
|
||||
DBUG_RETURN(0);
|
||||
DBUG_RETURN(error);
|
||||
#else
|
||||
return (0);
|
||||
#endif
|
||||
|
@ -6453,6 +6480,7 @@ int fill_schema_schema_privileges(THD *thd, TABLE_LIST *tables, COND *cond)
|
|||
int fill_schema_table_privileges(THD *thd, TABLE_LIST *tables, COND *cond)
|
||||
{
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
int error= 0;
|
||||
uint index;
|
||||
char buff[100];
|
||||
TABLE *table= tables->table;
|
||||
|
@ -6492,8 +6520,15 @@ int fill_schema_table_privileges(THD *thd, TABLE_LIST *tables, COND *cond)
|
|||
|
||||
strxmov(buff, "'", user, "'@'", host, "'", NullS);
|
||||
if (!test_access)
|
||||
update_schema_privilege(table, buff, grant_table->db, grant_table->tname,
|
||||
0, 0, STRING_WITH_LEN("USAGE"), is_grantable);
|
||||
{
|
||||
if (update_schema_privilege(thd, table, buff, grant_table->db,
|
||||
grant_table->tname, 0, 0,
|
||||
STRING_WITH_LEN("USAGE"), is_grantable))
|
||||
{
|
||||
error= 1;
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
ulong j;
|
||||
|
@ -6501,17 +6536,24 @@ int fill_schema_table_privileges(THD *thd, TABLE_LIST *tables, COND *cond)
|
|||
for (cnt= 0, j= SELECT_ACL; j <= TABLE_ACLS; cnt++, j<<= 1)
|
||||
{
|
||||
if (test_access & j)
|
||||
update_schema_privilege(table, buff, grant_table->db,
|
||||
grant_table->tname, 0, 0, command_array[cnt],
|
||||
command_lengths[cnt], is_grantable);
|
||||
{
|
||||
if (update_schema_privilege(thd, table, buff, grant_table->db,
|
||||
grant_table->tname, 0, 0,
|
||||
command_array[cnt],
|
||||
command_lengths[cnt], is_grantable))
|
||||
{
|
||||
error= 1;
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
err:
|
||||
rw_unlock(&LOCK_grant);
|
||||
|
||||
DBUG_RETURN(0);
|
||||
DBUG_RETURN(error);
|
||||
#else
|
||||
return (0);
|
||||
#endif
|
||||
|
@ -6521,6 +6563,7 @@ int fill_schema_table_privileges(THD *thd, TABLE_LIST *tables, COND *cond)
|
|||
int fill_schema_column_privileges(THD *thd, TABLE_LIST *tables, COND *cond)
|
||||
{
|
||||
#ifndef NO_EMBEDDED_ACCESS_CHECKS
|
||||
int error= 0;
|
||||
uint index;
|
||||
char buff[100];
|
||||
TABLE *table= tables->table;
|
||||
|
@ -6570,22 +6613,28 @@ int fill_schema_column_privileges(THD *thd, TABLE_LIST *tables, COND *cond)
|
|||
GRANT_COLUMN *grant_column = (GRANT_COLUMN*)
|
||||
hash_element(&grant_table->hash_columns,col_index);
|
||||
if ((grant_column->rights & j) && (table_access & j))
|
||||
update_schema_privilege(table, buff, grant_table->db,
|
||||
grant_table->tname,
|
||||
grant_column->column,
|
||||
grant_column->key_length,
|
||||
command_array[cnt],
|
||||
command_lengths[cnt], is_grantable);
|
||||
{
|
||||
if (update_schema_privilege(thd, table, buff, grant_table->db,
|
||||
grant_table->tname,
|
||||
grant_column->column,
|
||||
grant_column->key_length,
|
||||
command_array[cnt],
|
||||
command_lengths[cnt], is_grantable))
|
||||
{
|
||||
error= 1;
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
err:
|
||||
rw_unlock(&LOCK_grant);
|
||||
|
||||
DBUG_RETURN(0);
|
||||
DBUG_RETURN(error);
|
||||
#else
|
||||
return (0);
|
||||
#endif
|
||||
|
|
Loading…
Reference in a new issue