mirror of
https://github.com/MariaDB/server.git
synced 2025-07-27 18:02:13 +03:00
Merge bk-internal.mysql.com:/home/bk/mysql-5.1
into dipika.(none):/opt/local/work/mysql-5.1-runtime include/my_sys.h: Auto merged mysql-test/mysql-test-run.pl: Auto merged mysql-test/suite/binlog/r/binlog_row_binlog.result: Auto merged sql/item_cmpfunc.cc: Auto merged sql/log.cc: Auto merged sql/mysql_priv.h: Auto merged sql/mysqld.cc: Auto merged sql/set_var.cc: Auto merged sql/set_var.h: Auto merged sql/sql_acl.cc: Auto merged sql-common/client.c: Auto merged sql/sql_parse.cc: Auto merged sql/sql_view.cc: Auto merged
This commit is contained in:
@ -503,7 +503,7 @@ static bool check_merge_table_access(THD *thd, char *db,
|
||||
tlist->db= db; /* purecov: inspected */
|
||||
}
|
||||
error= check_table_access(thd, SELECT_ACL | UPDATE_ACL | DELETE_ACL,
|
||||
table_list,0);
|
||||
table_list, UINT_MAX, FALSE);
|
||||
}
|
||||
return error;
|
||||
}
|
||||
@ -2046,7 +2046,7 @@ mysql_execute_command(THD *thd)
|
||||
res= check_table_access(thd,
|
||||
lex->exchange ? SELECT_ACL | FILE_ACL :
|
||||
SELECT_ACL,
|
||||
all_tables, 0);
|
||||
all_tables, UINT_MAX, FALSE);
|
||||
}
|
||||
else
|
||||
res= check_access(thd,
|
||||
@ -2071,7 +2071,7 @@ mysql_execute_command(THD *thd)
|
||||
break;
|
||||
}
|
||||
case SQLCOM_DO:
|
||||
if (check_table_access(thd, SELECT_ACL, all_tables, 0) ||
|
||||
if (check_table_access(thd, SELECT_ACL, all_tables, UINT_MAX, FALSE) ||
|
||||
open_and_lock_tables(thd, all_tables))
|
||||
goto error;
|
||||
|
||||
@ -2181,7 +2181,7 @@ mysql_execute_command(THD *thd)
|
||||
case SQLCOM_BACKUP_TABLE:
|
||||
{
|
||||
DBUG_ASSERT(first_table == all_tables && first_table != 0);
|
||||
if (check_table_access(thd, SELECT_ACL, all_tables, 0) ||
|
||||
if (check_table_access(thd, SELECT_ACL, all_tables, UINT_MAX, FALSE) ||
|
||||
check_global_access(thd, FILE_ACL))
|
||||
goto error; /* purecov: inspected */
|
||||
thd->enable_slow_log= opt_log_slow_admin_statements;
|
||||
@ -2193,7 +2193,7 @@ mysql_execute_command(THD *thd)
|
||||
case SQLCOM_RESTORE_TABLE:
|
||||
{
|
||||
DBUG_ASSERT(first_table == all_tables && first_table != 0);
|
||||
if (check_table_access(thd, INSERT_ACL, all_tables, 0) ||
|
||||
if (check_table_access(thd, INSERT_ACL, all_tables, UINT_MAX, FALSE) ||
|
||||
check_global_access(thd, FILE_ACL))
|
||||
goto error; /* purecov: inspected */
|
||||
thd->enable_slow_log= opt_log_slow_admin_statements;
|
||||
@ -2270,14 +2270,14 @@ mysql_execute_command(THD *thd)
|
||||
#endif /* HAVE_REPLICATION */
|
||||
case SQLCOM_SHOW_ENGINE_STATUS:
|
||||
{
|
||||
if (check_global_access(thd, SUPER_ACL))
|
||||
if (check_global_access(thd, PROCESS_ACL))
|
||||
goto error;
|
||||
res = ha_show_status(thd, lex->create_info.db_type, HA_ENGINE_STATUS);
|
||||
break;
|
||||
}
|
||||
case SQLCOM_SHOW_ENGINE_MUTEX:
|
||||
{
|
||||
if (check_global_access(thd, SUPER_ACL))
|
||||
if (check_global_access(thd, PROCESS_ACL))
|
||||
goto error;
|
||||
res = ha_show_status(thd, lex->create_info.db_type, HA_ENGINE_MUTEX);
|
||||
break;
|
||||
@ -2742,7 +2742,8 @@ end_with_restore_list:
|
||||
case SQLCOM_CHECKSUM:
|
||||
{
|
||||
DBUG_ASSERT(first_table == all_tables && first_table != 0);
|
||||
if (check_table_access(thd, SELECT_ACL | EXTRA_ACL, all_tables, 0))
|
||||
if (check_table_access(thd, SELECT_ACL | EXTRA_ACL, all_tables,
|
||||
UINT_MAX, FALSE))
|
||||
goto error; /* purecov: inspected */
|
||||
res = mysql_checksum_table(thd, first_table, &lex->check_opt);
|
||||
break;
|
||||
@ -2750,7 +2751,8 @@ end_with_restore_list:
|
||||
case SQLCOM_REPAIR:
|
||||
{
|
||||
DBUG_ASSERT(first_table == all_tables && first_table != 0);
|
||||
if (check_table_access(thd, SELECT_ACL | INSERT_ACL, all_tables, 0))
|
||||
if (check_table_access(thd, SELECT_ACL | INSERT_ACL, all_tables,
|
||||
UINT_MAX, FALSE))
|
||||
goto error; /* purecov: inspected */
|
||||
thd->enable_slow_log= opt_log_slow_admin_statements;
|
||||
res= mysql_repair_table(thd, first_table, &lex->check_opt);
|
||||
@ -2769,7 +2771,8 @@ end_with_restore_list:
|
||||
case SQLCOM_CHECK:
|
||||
{
|
||||
DBUG_ASSERT(first_table == all_tables && first_table != 0);
|
||||
if (check_table_access(thd, SELECT_ACL | EXTRA_ACL , all_tables, 0))
|
||||
if (check_table_access(thd, SELECT_ACL | EXTRA_ACL , all_tables,
|
||||
UINT_MAX, FALSE))
|
||||
goto error; /* purecov: inspected */
|
||||
thd->enable_slow_log= opt_log_slow_admin_statements;
|
||||
res = mysql_check_table(thd, first_table, &lex->check_opt);
|
||||
@ -2780,7 +2783,8 @@ end_with_restore_list:
|
||||
case SQLCOM_ANALYZE:
|
||||
{
|
||||
DBUG_ASSERT(first_table == all_tables && first_table != 0);
|
||||
if (check_table_access(thd, SELECT_ACL | INSERT_ACL, all_tables, 0))
|
||||
if (check_table_access(thd, SELECT_ACL | INSERT_ACL, all_tables,
|
||||
UINT_MAX, FALSE))
|
||||
goto error; /* purecov: inspected */
|
||||
thd->enable_slow_log= opt_log_slow_admin_statements;
|
||||
res= mysql_analyze_table(thd, first_table, &lex->check_opt);
|
||||
@ -2800,7 +2804,8 @@ end_with_restore_list:
|
||||
case SQLCOM_OPTIMIZE:
|
||||
{
|
||||
DBUG_ASSERT(first_table == all_tables && first_table != 0);
|
||||
if (check_table_access(thd, SELECT_ACL | INSERT_ACL, all_tables, 0))
|
||||
if (check_table_access(thd, SELECT_ACL | INSERT_ACL, all_tables,
|
||||
UINT_MAX, FALSE))
|
||||
goto error; /* purecov: inspected */
|
||||
thd->enable_slow_log= opt_log_slow_admin_statements;
|
||||
res= (specialflag & (SPECIAL_SAFE_MODE | SPECIAL_NO_NEW_FUNC)) ?
|
||||
@ -3129,7 +3134,7 @@ end_with_restore_list:
|
||||
DBUG_ASSERT(first_table == all_tables && first_table != 0);
|
||||
if (!lex->drop_temporary)
|
||||
{
|
||||
if (check_table_access(thd, DROP_ACL, all_tables, 0))
|
||||
if (check_table_access(thd, DROP_ACL, all_tables, UINT_MAX, FALSE))
|
||||
goto error; /* purecov: inspected */
|
||||
if (end_active_trans(thd))
|
||||
goto error;
|
||||
@ -3233,7 +3238,7 @@ end_with_restore_list:
|
||||
if (lex->autocommit && end_active_trans(thd))
|
||||
goto error;
|
||||
|
||||
if ((check_table_access(thd, SELECT_ACL, all_tables, 0) ||
|
||||
if ((check_table_access(thd, SELECT_ACL, all_tables, UINT_MAX, FALSE) ||
|
||||
open_and_lock_tables(thd, all_tables)))
|
||||
goto error;
|
||||
if (lex->one_shot_set && not_all_support_one_shot(lex_var_list))
|
||||
@ -3275,7 +3280,8 @@ end_with_restore_list:
|
||||
/* we must end the trasaction first, regardless of anything */
|
||||
if (end_active_trans(thd))
|
||||
goto error;
|
||||
if (check_table_access(thd, LOCK_TABLES_ACL | SELECT_ACL, all_tables, 0))
|
||||
if (check_table_access(thd, LOCK_TABLES_ACL | SELECT_ACL, all_tables,
|
||||
UINT_MAX, FALSE))
|
||||
goto error;
|
||||
thd->in_lock_tables=1;
|
||||
thd->options|= OPTION_TABLE_LOCK;
|
||||
@ -3769,7 +3775,7 @@ end_with_restore_list:
|
||||
#endif
|
||||
case SQLCOM_HA_OPEN:
|
||||
DBUG_ASSERT(first_table == all_tables && first_table != 0);
|
||||
if (check_table_access(thd, SELECT_ACL, all_tables, 0))
|
||||
if (check_table_access(thd, SELECT_ACL, all_tables, UINT_MAX, FALSE))
|
||||
goto error;
|
||||
res= mysql_ha_open(thd, first_table, 0);
|
||||
break;
|
||||
@ -4017,7 +4023,7 @@ create_sp_error:
|
||||
This will cache all SP and SF and open and lock all tables
|
||||
required for execution.
|
||||
*/
|
||||
if (check_table_access(thd, SELECT_ACL, all_tables, 0) ||
|
||||
if (check_table_access(thd, SELECT_ACL, all_tables, UINT_MAX, FALSE) ||
|
||||
open_and_lock_tables(thd, all_tables))
|
||||
goto error;
|
||||
|
||||
@ -4364,7 +4370,7 @@ create_sp_error:
|
||||
}
|
||||
case SQLCOM_DROP_VIEW:
|
||||
{
|
||||
if (check_table_access(thd, DROP_ACL, all_tables, 0) ||
|
||||
if (check_table_access(thd, DROP_ACL, all_tables, UINT_MAX, FALSE) ||
|
||||
end_active_trans(thd))
|
||||
goto error;
|
||||
/* Conditionally writes to binlog. */
|
||||
@ -4840,7 +4846,7 @@ bool check_one_table_access(THD *thd, ulong privilege, TABLE_LIST *all_tables)
|
||||
subselects_tables= subselects_tables->next_global;
|
||||
}
|
||||
if (subselects_tables &&
|
||||
(check_table_access(thd, SELECT_ACL, subselects_tables, 0)))
|
||||
(check_table_access(thd, SELECT_ACL, subselects_tables, UINT_MAX, FALSE)))
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
@ -5074,11 +5080,12 @@ static bool check_show_access(THD *thd, TABLE_LIST *table)
|
||||
/**
|
||||
Check the privilege for all used tables.
|
||||
|
||||
@param thd Thread context
|
||||
@param want_access Privileges requested
|
||||
@param tables List of tables to be checked
|
||||
@param no_errors FALSE/TRUE - report/don't report error to
|
||||
the client (using my_error() call).
|
||||
@param thd Thread context
|
||||
@param want_access Privileges requested
|
||||
@param tables List of tables to be checked
|
||||
@param number Check at most this number of tables.
|
||||
@param no_errors FALSE/TRUE - report/don't report error to
|
||||
the client (using my_error() call).
|
||||
|
||||
@note
|
||||
Table privileges are cached in the table list for GRANT checking.
|
||||
@ -5087,25 +5094,25 @@ static bool check_show_access(THD *thd, TABLE_LIST *table)
|
||||
(the latter should be either 0 or point to next_global member
|
||||
of one of elements of this table list).
|
||||
|
||||
@retval
|
||||
FALSE OK
|
||||
@retval
|
||||
TRUE Access denied
|
||||
@retval FALSE OK
|
||||
@retval TRUE Access denied
|
||||
*/
|
||||
|
||||
bool
|
||||
check_table_access(THD *thd, ulong want_access,TABLE_LIST *tables,
|
||||
bool no_errors)
|
||||
uint number, bool no_errors)
|
||||
{
|
||||
TABLE_LIST *org_tables= tables;
|
||||
TABLE_LIST *first_not_own_table= thd->lex->first_not_own_table();
|
||||
uint i= 0;
|
||||
Security_context *sctx= thd->security_ctx, *backup_ctx= thd->security_ctx;
|
||||
/*
|
||||
The check that first_not_own_table is not reached is for the case when
|
||||
the given table list refers to the list for prelocking (contains tables
|
||||
of other queries). For simple queries first_not_own_table is 0.
|
||||
*/
|
||||
for (; tables != first_not_own_table; tables= tables->next_global)
|
||||
for (; i < number && tables != first_not_own_table;
|
||||
tables= tables->next_global, i++)
|
||||
{
|
||||
if (tables->security_ctx)
|
||||
sctx= tables->security_ctx;
|
||||
@ -5155,7 +5162,7 @@ check_table_access(THD *thd, ulong want_access,TABLE_LIST *tables,
|
||||
}
|
||||
thd->security_ctx= backup_ctx;
|
||||
return check_grant(thd,want_access & ~EXTRA_ACL,org_tables,
|
||||
test(want_access & EXTRA_ACL), UINT_MAX, no_errors);
|
||||
test(want_access & EXTRA_ACL), number, no_errors);
|
||||
deny:
|
||||
thd->security_ctx= backup_ctx;
|
||||
return TRUE;
|
||||
@ -6884,7 +6891,7 @@ bool multi_delete_precheck(THD *thd, TABLE_LIST *tables)
|
||||
|
||||
/* sql_yacc guarantees that tables and aux_tables are not zero */
|
||||
DBUG_ASSERT(aux_tables != 0);
|
||||
if (check_table_access(thd, SELECT_ACL, tables, 0))
|
||||
if (check_table_access(thd, SELECT_ACL, tables, UINT_MAX, FALSE))
|
||||
DBUG_RETURN(TRUE);
|
||||
|
||||
/*
|
||||
@ -6893,7 +6900,7 @@ bool multi_delete_precheck(THD *thd, TABLE_LIST *tables)
|
||||
call check_table_access() safely.
|
||||
*/
|
||||
thd->lex->query_tables_own_last= 0;
|
||||
if (check_table_access(thd, DELETE_ACL, aux_tables, 0))
|
||||
if (check_table_access(thd, DELETE_ACL, aux_tables, UINT_MAX, FALSE))
|
||||
{
|
||||
thd->lex->query_tables_own_last= save_query_tables_own_last;
|
||||
DBUG_RETURN(TRUE);
|
||||
@ -7132,7 +7139,7 @@ bool create_table_precheck(THD *thd, TABLE_LIST *tables,
|
||||
}
|
||||
}
|
||||
#endif
|
||||
if (tables && check_table_access(thd, SELECT_ACL, tables,0))
|
||||
if (tables && check_table_access(thd, SELECT_ACL, tables, UINT_MAX, FALSE))
|
||||
goto err;
|
||||
}
|
||||
else if (lex->create_info.options & HA_LEX_CREATE_TABLE_LIKE)
|
||||
|
Reference in New Issue
Block a user