summaryrefslogtreecommitdiff
path: root/sql/sql_view.cc
diff options
context:
space:
mode:
authorTatjana Azundris Nuernberg <tatjana.nuernberg@oracle.com>2011-09-29 10:56:21 +0100
committerTatjana Azundris Nuernberg <tatjana.nuernberg@oracle.com>2011-09-29 10:56:21 +0100
commit7944320f4e76aabd7b73015d2569f8c26f045f2c (patch)
tree0b24d955807eb1ab3fc65d080afbb089b00046f6 /sql/sql_view.cc
parent1922d65fd8881836b57ac925596dac4cb753e29b (diff)
parent8932ae216674f08880a6f914b9651262037175be (diff)
downloadmariadb-git-7944320f4e76aabd7b73015d2569f8c26f045f2c.tar.gz
manual merge
Diffstat (limited to 'sql/sql_view.cc')
-rw-r--r--sql/sql_view.cc34
1 files changed, 32 insertions, 2 deletions
diff --git a/sql/sql_view.cc b/sql/sql_view.cc
index ab6da7c1925..0d34b5601f6 100644
--- a/sql/sql_view.cc
+++ b/sql/sql_view.cc
@@ -1265,8 +1265,38 @@ bool mysql_make_view(THD *thd, File_parser *parser, TABLE_LIST *table,
if (!table->prelocking_placeholder &&
(old_lex->sql_command == SQLCOM_SELECT && old_lex->describe))
{
- if (check_table_access(thd, SELECT_ACL, view_tables, UINT_MAX, TRUE) &&
- check_table_access(thd, SHOW_VIEW_ACL, table, UINT_MAX, TRUE))
+ /*
+ The user we run EXPLAIN as (either the connected user who issued
+ the EXPLAIN statement, or the definer of a SUID stored routine
+ which contains the EXPLAIN) should have both SHOW_VIEW_ACL and
+ SELECT_ACL on the view being opened as well as on all underlying
+ views since EXPLAIN will disclose their structure. This user also
+ should have SELECT_ACL on all underlying tables of the view since
+ this EXPLAIN will disclose information about the number of rows in it.
+
+ To perform this privilege check we create auxiliary TABLE_LIST object
+ for the view in order a) to avoid trashing "table->grant" member for
+ original table list element, which contents can be important at later
+ stage for column-level privilege checking b) get TABLE_LIST object
+ with "security_ctx" member set to 0, i.e. forcing check_table_access()
+ to use active user's security context.
+
+ There is no need for creating similar copies of table list elements
+ for underlying tables since they are just have been constructed and
+ thus have TABLE_LIST::security_ctx == 0 and fresh TABLE_LIST::grant
+ member.
+
+ Finally at this point making sure we have SHOW_VIEW_ACL on the views
+ will suffice as we implicitly require SELECT_ACL anyway.
+ */
+
+ TABLE_LIST view;
+ bzero((char *)&view, sizeof(TABLE_LIST));
+ view.db= table->db;
+ view.table_name= table->table_name;
+
+ if (check_table_access(thd, SELECT_ACL, view_tables, UINT_MAX, TRUE) ||
+ check_table_access(thd, SHOW_VIEW_ACL, &view, UINT_MAX, TRUE))
{
my_message(ER_VIEW_NO_EXPLAIN, ER(ER_VIEW_NO_EXPLAIN), MYF(0));
goto err;