summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <bell@sanja.is.com.ua>2003-05-28 02:06:56 +0300
committerunknown <bell@sanja.is.com.ua>2003-05-28 02:06:56 +0300
commit15b3f3a0d8c11babff0f2e4dfa81c1716bcf533d (patch)
tree2fbf977dbd1d615c826dc636d0d9e7e753217587
parent2e3f106578def9cb8ac009bacac051a7915ca744 (diff)
downloadmariadb-git-15b3f3a0d8c11babff0f2e4dfa81c1716bcf533d.tar.gz
after-review fix
-rw-r--r--sql/sql_parse.cc89
1 files changed, 45 insertions, 44 deletions
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 473c1dd07f6..78b6a03e2fa 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -59,6 +59,9 @@ static void refresh_status(void);
static bool append_file_to_dir(THD *thd, char **filename_ptr,
char *table_name);
+inline bool single_table_command_access(THD *thd, ulong privilege,
+ TABLE_LIST *tables, int *res);
+
const char *any_db="*any*"; // Special symbol for check_access
const char *command_name[]={
@@ -2286,21 +2289,8 @@ mysql_execute_command(THD *thd)
if (check_db_used(thd,tables))
goto error;
- if (check_access(thd,UPDATE_ACL,tables->db,&tables->grant.privilege))
- goto error;
- {
- // Show only 1 table for check_grant
- TABLE_LIST *subselects_tables= tables->next;
- tables->next= 0;
- if (grant_option && check_grant(thd, UPDATE_ACL, tables))
+ if (single_table_command_access(thd, UPDATE_ACL, tables, &res))
goto error;
- tables->next= subselects_tables;
-
- // check rights on tables of subselect (if exists)
- if (subselects_tables &&
- (res= check_table_access(thd, SELECT_ACL, subselects_tables)))
- goto error;
- }
if (select_lex->item_list.elements != lex->value_list.elements)
{
@@ -2355,22 +2345,9 @@ mysql_execute_command(THD *thd)
my_bool update=(lex->value_list.elements ? UPDATE_ACL : 0);
ulong privilege= (lex->duplicates == DUP_REPLACE ?
INSERT_ACL | DELETE_ACL : INSERT_ACL | update);
- if (check_access(thd,privilege,tables->db,&tables->grant.privilege))
- goto error; /* purecov: inspected */
-
- {
- // Show only 1 table for check_grant
- TABLE_LIST *subselects_tables= tables->next;
- tables->next= 0;
- if (grant_option && check_grant(thd, privilege, tables))
- goto error;
- tables->next= subselects_tables;
- // check rights on tables of subselect (if exists)
- if (subselects_tables &&
- (res= check_table_access(thd, SELECT_ACL, subselects_tables)))
+ if (single_table_command_access(thd, privilege, tables, &res))
goto error;
- }
if (select_lex->item_list.elements != lex->value_list.elements)
{
@@ -2453,22 +2430,8 @@ mysql_execute_command(THD *thd)
break;
case SQLCOM_DELETE:
{
- if (check_access(thd,DELETE_ACL,tables->db,&tables->grant.privilege))
- goto error; /* purecov: inspected */
-
- {
- // Show only 1 table for check_grant
- TABLE_LIST *subselects_tables= tables->next;
- tables->next= 0;
- if (grant_option && check_grant(thd, DELETE_ACL, tables))
- goto error;
- tables->next= subselects_tables;
-
- // check rights on tables of subselect (if exists)
- if (subselects_tables &&
- (res= check_table_access(thd, SELECT_ACL, subselects_tables)))
- goto error;
- }
+ if (single_table_command_access(thd, DELETE_ACL, tables, &res))
+ goto error;
// Set privilege for the WHERE clause
tables->grant.want_privilege=(SELECT_ACL & ~tables->grant.privilege);
@@ -3128,6 +3091,44 @@ error:
}
+/*
+ Check grants for commands which work only with one table and all other
+ tables belong to subselects.
+
+ SYNOPSYS
+ single_table_command_access()
+ thd - Thread handler
+ privilege - asked privelage
+ tables - table list of command
+ res - pointer on result code variable
+
+ RETURN
+ 0 - OK
+ 1 - access denied
+*/
+
+inline bool single_table_command_access(THD *thd, ulong privilege,
+ TABLE_LIST *tables, int *res)
+
+{
+ if (check_access(thd, privilege, tables->db, &tables->grant.privilege))
+ return 1;
+
+ // Show only 1 table for check_grant
+ TABLE_LIST *subselects_tables= tables->next;
+ tables->next= 0;
+ if (grant_option && check_grant(thd, privilege, tables))
+ return 1;
+ tables->next= subselects_tables;
+
+ // check rights on tables of subselect (if exists)
+ if (subselects_tables &&
+ (*res= check_table_access(thd, SELECT_ACL, subselects_tables)))
+ return 1;
+ return 0;
+}
+
+
/****************************************************************************
Get the user (global) and database privileges for all used tables