summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVicențiu Ciorbaru <cvicentiu@gmail.com>2022-06-08 17:42:49 +0300
committerVicențiu Ciorbaru <cvicentiu@gmail.com>2022-06-12 17:24:12 +0300
commit97d340d4fb0b1e9ad3841796170c56ba3799c901 (patch)
treeb6880ef7cf0ec6c4d87f448f92b74cf02bddc743
parentd48480c692123473337a583dbec2b1dffa0ebcc0 (diff)
downloadmariadb-git-97d340d4fb0b1e9ad3841796170c56ba3799c901.tar.gz
cleanup: get_column_grant takes in LEX_CSTRINGS instead of char *
This eliminates the need to recompute strlen of the parameters, given that most callers already have the strlen computed.
-rw-r--r--sql/item.cc10
-rw-r--r--sql/sql_acl.cc23
-rw-r--r--sql/sql_acl.h5
-rw-r--r--sql/sql_base.cc21
-rw-r--r--sql/sql_show.cc8
-rw-r--r--sql/sql_view.cc9
6 files changed, 46 insertions, 30 deletions
diff --git a/sql/item.cc b/sql/item.cc
index 3ea0fec3b4e..4eb8e50be84 100644
--- a/sql/item.cc
+++ b/sql/item.cc
@@ -6181,16 +6181,16 @@ bool Item_field::fix_fields(THD *thd, Item **reference)
#ifndef NO_EMBEDDED_ACCESS_CHECKS
if (any_privileges)
{
- const char *db, *tab;
- db= field->table->s->db.str;
- tab= field->table->s->table_name.str;
if (!(have_privileges= (get_column_grant(thd, &field->table->grant,
- db, tab, field_name.str) &
+ field->table->s->db,
+ field->table->s->table_name,
+ field_name) &
VIEW_ANY_ACL)))
{
my_error(ER_COLUMNACCESS_DENIED_ERROR, MYF(0),
"ANY", thd->security_ctx->priv_user,
- thd->security_ctx->host_or_ip, field_name.str, tab);
+ thd->security_ctx->host_or_ip, field_name.str,
+ field->table->s->table_name.str);
goto error;
}
}
diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc
index 2d235961126..387cc719bd1 100644
--- a/sql/sql_acl.cc
+++ b/sql/sql_acl.cc
@@ -9795,7 +9795,7 @@ bool check_column_grant_in_table_ref(THD *thd, TABLE_LIST * table_ref,
thd->lex->sql_command == SQLCOM_SHOW_FIELDS)
{
view_privs= get_column_grant(thd, grant,
- db_name->str, table_name->str, name);
+ *db_name, *table_name, {name, length});
if (view_privs & VIEW_ANY_ACL)
{
table_ref->belong_to_view->allowed_show= TRUE;
@@ -10260,8 +10260,9 @@ privilege_t get_table_grant(THD *thd, TABLE_LIST *table)
*/
privilege_t get_column_grant(THD *thd, GRANT_INFO *grant,
- const char *db_name, const char *table_name,
- const char *field_name)
+ const LEX_CSTRING &db_name,
+ const LEX_CSTRING &table_name,
+ const LEX_CSTRING &field_name)
{
GRANT_TABLE *grant_table;
GRANT_TABLE *grant_table_role;
@@ -10283,12 +10284,12 @@ privilege_t get_column_grant(THD *thd, GRANT_INFO *grant,
grant->grant_table_user=
table_hash_search(sctx->host, sctx->ip,
- db_name, sctx->priv_user,
- table_name, 0); /* purecov: inspected */
+ db_name.str, sctx->priv_user,
+ table_name.str, 0); /* purecov: inspected */
grant->grant_table_role=
- sctx->priv_role[0] ? table_hash_search("", "", db_name,
+ sctx->priv_role[0] ? table_hash_search("", "", db_name.str,
sctx->priv_role,
- table_name, TRUE) : NULL;
+ table_name.str, TRUE) : NULL;
grant->version= grant_version; /* purecov: inspected */
}
@@ -10301,8 +10302,8 @@ privilege_t get_column_grant(THD *thd, GRANT_INFO *grant,
{
if (grant_table)
{
- grant_column= column_hash_search(grant_table, field_name,
- (uint) strlen(field_name));
+ grant_column= column_hash_search(grant_table, field_name.str,
+ field_name.length);
if (!grant_column)
priv= (grant->privilege | grant_table->privs);
else
@@ -10311,8 +10312,8 @@ privilege_t get_column_grant(THD *thd, GRANT_INFO *grant,
if (grant_table_role)
{
- grant_column= column_hash_search(grant_table_role, field_name,
- (uint) strlen(field_name));
+ grant_column= column_hash_search(grant_table_role, field_name.str,
+ field_name.length);
if (!grant_column)
priv|= (grant->privilege | grant_table_role->privs);
else
diff --git a/sql/sql_acl.h b/sql/sql_acl.h
index f8eb49dbda4..0238e0e5fa5 100644
--- a/sql/sql_acl.h
+++ b/sql/sql_acl.h
@@ -159,8 +159,9 @@ check_table_access(THD *thd, privilege_t requirements,TABLE_LIST *tables,
privilege_t get_table_grant(THD *thd, TABLE_LIST *table);
privilege_t get_column_grant(THD *thd, GRANT_INFO *grant,
- const char *db_name, const char *table_name,
- const char *field_name);
+ const LEX_CSTRING &db_name,
+ const LEX_CSTRING &table_name,
+ const LEX_CSTRING &field_name);
bool get_show_user(THD *thd, LEX_USER *lex_user, const char **username,
const char **hostname, const char **rolename);
void mysql_show_grants_get_fields(THD *thd, List<Item> *fields,
diff --git a/sql/sql_base.cc b/sql/sql_base.cc
index fedc3bb122b..d31ba5210b6 100644
--- a/sql/sql_base.cc
+++ b/sql/sql_base.cc
@@ -8467,19 +8467,32 @@ insert_fields(THD *thd, Name_resolution_context *context, const char *db_name,
tables->is_natural_join);
DBUG_ASSERT(item->type() == Item::FIELD_ITEM);
Item_field *fld= (Item_field*) item;
- const char *field_table_name= field_iterator.get_table_name();
+ /*
+ TODO(cvicentiu) constructing these lex_cstrings could be avoided
+ if we updated all the users of field_iterator::get_xxx_name to
+ use LEX_CSTRING.
+ */
+ const LEX_CSTRING field_db_name = {
+ field_iterator.get_db_name(),
+ strlen(field_iterator.get_db_name())
+ };
+
+ const LEX_CSTRING field_table_name= {
+ field_iterator.get_table_name(),
+ strlen(field_iterator.get_table_name())
+ };
if (!tables->schema_table &&
!(fld->have_privileges=
(get_column_grant(thd, field_iterator.grant(),
- field_iterator.get_db_name(),
- field_table_name, fld->field_name.str) &
+ field_db_name, field_table_name,
+ fld->field_name) &
VIEW_ANY_ACL)))
{
my_error(ER_TABLEACCESS_DENIED_ERROR, MYF(0), "ANY",
thd->security_ctx->priv_user,
thd->security_ctx->host_or_ip,
- field_table_name);
+ field_table_name.str);
DBUG_RETURN(TRUE);
}
}
diff --git a/sql/sql_show.cc b/sql/sql_show.cc
index a92992605cd..7f859076b1d 100644
--- a/sql/sql_show.cc
+++ b/sql/sql_show.cc
@@ -1118,8 +1118,8 @@ public:
push_warning_printf(thd, Sql_condition::WARN_LEVEL_WARN,
ER_VIEW_INVALID,
ER_THD(thd, ER_VIEW_INVALID),
- m_top_view->get_db_name(),
- m_top_view->get_table_name());
+ m_top_view->get_db_name().str,
+ m_top_view->get_table_name().str);
is_handled= TRUE;
break;
@@ -6121,8 +6121,8 @@ static int get_schema_column_record(THD *thd, TABLE_LIST *tables,
check_access(thd,SELECT_ACL, db_name->str,
&tables->grant.privilege, 0, 0, MY_TEST(tables->schema_table));
col_access= get_column_grant(thd, &tables->grant,
- db_name->str, table_name->str,
- field->field_name.str) & COL_ACLS;
+ *db_name, *table_name,
+ field->field_name) & COL_ACLS;
if (!tables->schema_table && !col_access)
continue;
char *end= tmp;
diff --git a/sql/sql_view.cc b/sql/sql_view.cc
index 9f9ef6335f3..90c4e4fe0dc 100644
--- a/sql/sql_view.cc
+++ b/sql/sql_view.cc
@@ -624,10 +624,11 @@ bool mysql_create_view(THD *thd, TABLE_LIST *views,
while ((item= it++))
{
Item_field *fld= item->field_for_view_update();
- privilege_t priv(get_column_grant(thd, &view->grant, view->db.str,
- view->table_name.str,
- item->name.str) &
- VIEW_ANY_ACL);
+ privilege_t priv(get_column_grant(thd, &view->grant,
+ view->db,
+ view->table_name,
+ item->name) &
+ VIEW_ANY_ACL);
if (!fld)
continue;