mirror of
https://github.com/MariaDB/server.git
synced 2025-07-27 18:02:13 +03:00
Merge branch '5.5' into 10.0
This commit is contained in:
@ -6720,16 +6720,18 @@ bool check_grant(THD *thd, ulong want_access, TABLE_LIST *tables,
|
||||
|
||||
for (tl= tables; number-- ; tl= tl->next_global)
|
||||
{
|
||||
sctx= MY_TEST(tl->security_ctx) ? tl->security_ctx : thd->security_ctx;
|
||||
TABLE_LIST *const t_ref=
|
||||
tl->correspondent_table ? tl->correspondent_table : tl;
|
||||
sctx= t_ref->security_ctx ? t_ref->security_ctx : thd->security_ctx;
|
||||
|
||||
const ACL_internal_table_access *access=
|
||||
get_cached_table_access(&tl->grant.m_internal,
|
||||
tl->get_db_name(),
|
||||
tl->get_table_name());
|
||||
get_cached_table_access(&t_ref->grant.m_internal,
|
||||
t_ref->get_db_name(),
|
||||
t_ref->get_table_name());
|
||||
|
||||
if (access)
|
||||
{
|
||||
switch(access->check(orig_want_access, &tl->grant.privilege))
|
||||
switch(access->check(orig_want_access, &t_ref->grant.privilege))
|
||||
{
|
||||
case ACL_INTERNAL_ACCESS_GRANTED:
|
||||
/*
|
||||
@ -6753,26 +6755,26 @@ bool check_grant(THD *thd, ulong want_access, TABLE_LIST *tables,
|
||||
if (!want_access)
|
||||
continue; // ok
|
||||
|
||||
if (!(~tl->grant.privilege & want_access) ||
|
||||
tl->is_anonymous_derived_table() || tl->schema_table)
|
||||
if (!(~t_ref->grant.privilege & want_access) ||
|
||||
t_ref->is_anonymous_derived_table() || t_ref->schema_table)
|
||||
{
|
||||
/*
|
||||
It is subquery in the FROM clause. VIEW set tl->derived after
|
||||
It is subquery in the FROM clause. VIEW set t_ref->derived after
|
||||
table opening, but this function always called before table opening.
|
||||
*/
|
||||
if (!tl->referencing_view)
|
||||
if (!t_ref->referencing_view)
|
||||
{
|
||||
/*
|
||||
If it's a temporary table created for a subquery in the FROM
|
||||
clause, or an INFORMATION_SCHEMA table, drop the request for
|
||||
a privilege.
|
||||
*/
|
||||
tl->grant.want_privilege= 0;
|
||||
t_ref->grant.want_privilege= 0;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
if (is_temporary_table(tl))
|
||||
if (is_temporary_table(t_ref))
|
||||
{
|
||||
/*
|
||||
If this table list element corresponds to a pre-opened temporary
|
||||
@ -6780,8 +6782,8 @@ bool check_grant(THD *thd, ulong want_access, TABLE_LIST *tables,
|
||||
Note that during creation of temporary table we still need to check
|
||||
if user has CREATE_TMP_ACL.
|
||||
*/
|
||||
tl->grant.privilege|= TMP_TABLE_ACLS;
|
||||
tl->grant.want_privilege= 0;
|
||||
t_ref->grant.privilege|= TMP_TABLE_ACLS;
|
||||
t_ref->grant.want_privilege= 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -6792,20 +6794,20 @@ bool check_grant(THD *thd, ulong want_access, TABLE_LIST *tables,
|
||||
}
|
||||
|
||||
grant_table= table_hash_search(sctx->host, sctx->ip,
|
||||
tl->get_db_name(),
|
||||
t_ref->get_db_name(),
|
||||
sctx->priv_user,
|
||||
tl->get_table_name(),
|
||||
t_ref->get_table_name(),
|
||||
FALSE);
|
||||
if (sctx->priv_role[0])
|
||||
grant_table_role= table_hash_search("", NULL, tl->get_db_name(),
|
||||
grant_table_role= table_hash_search("", NULL, t_ref->get_db_name(),
|
||||
sctx->priv_role,
|
||||
tl->get_table_name(),
|
||||
t_ref->get_table_name(),
|
||||
TRUE);
|
||||
|
||||
if (!grant_table && !grant_table_role)
|
||||
{
|
||||
want_access&= ~tl->grant.privilege;
|
||||
goto err;
|
||||
want_access&= ~t_ref->grant.privilege;
|
||||
goto err; // No grants
|
||||
}
|
||||
|
||||
/*
|
||||
@ -6815,19 +6817,19 @@ bool check_grant(THD *thd, ulong want_access, TABLE_LIST *tables,
|
||||
if (any_combination_will_do)
|
||||
continue;
|
||||
|
||||
tl->grant.grant_table_user= grant_table; // Remember for column test
|
||||
tl->grant.grant_table_role= grant_table_role;
|
||||
tl->grant.version= grant_version;
|
||||
tl->grant.privilege|= grant_table ? grant_table->privs : 0;
|
||||
tl->grant.privilege|= grant_table_role ? grant_table_role->privs : 0;
|
||||
tl->grant.want_privilege= ((want_access & COL_ACLS) & ~tl->grant.privilege);
|
||||
t_ref->grant.grant_table_user= grant_table; // Remember for column test
|
||||
t_ref->grant.grant_table_role= grant_table_role;
|
||||
t_ref->grant.version= grant_version;
|
||||
t_ref->grant.privilege|= grant_table ? grant_table->privs : 0;
|
||||
t_ref->grant.privilege|= grant_table_role ? grant_table_role->privs : 0;
|
||||
t_ref->grant.want_privilege= ((want_access & COL_ACLS) & ~t_ref->grant.privilege);
|
||||
|
||||
if (!(~tl->grant.privilege & want_access))
|
||||
if (!(~t_ref->grant.privilege & want_access))
|
||||
continue;
|
||||
|
||||
if ((want_access&= ~((grant_table ? grant_table->cols : 0) |
|
||||
(grant_table_role ? grant_table_role->cols : 0) |
|
||||
tl->grant.privilege)))
|
||||
t_ref->grant.privilege)))
|
||||
{
|
||||
goto err; // impossible
|
||||
}
|
||||
|
Reference in New Issue
Block a user