summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergei Golubchik <serg@mariadb.org>2023-02-01 18:56:10 +0100
committerSergei Golubchik <serg@mariadb.org>2023-02-21 23:22:56 +0100
commit2e6a9886a9f0aea55035dbdcf74bf09c0f7e2a30 (patch)
tree28c3ab511b65c7acdf9cc087b1192c1a3176a0ac
parent3c6f108540862ef91889ee2bf975fad64237dabb (diff)
downloadmariadb-git-2e6a9886a9f0aea55035dbdcf74bf09c0f7e2a30.tar.gz
MDEV-30526 Assertion `rights == merged->cols' failed in update_role_columns
another case of the antipattern "iterate the HASH and delete elements as we go"
-rw-r--r--mysql-test/suite/roles/role_grant_propagate.result13
-rw-r--r--mysql-test/suite/roles/role_grant_propagate.test11
-rw-r--r--sql/sql_acl.cc2
3 files changed, 26 insertions, 0 deletions
diff --git a/mysql-test/suite/roles/role_grant_propagate.result b/mysql-test/suite/roles/role_grant_propagate.result
index 7804b7b7a3c..111fd4dbc28 100644
--- a/mysql-test/suite/roles/role_grant_propagate.result
+++ b/mysql-test/suite/roles/role_grant_propagate.result
@@ -163,5 +163,18 @@ drop role student;
drop role admin;
drop database crm;
#
+# MDEV-30526 Assertion `rights == merged->cols' failed in update_role_columns
+#
+create table t1 ( pk int, i int);
+create role a;
+grant select (i), update (pk) on t1 to a;
+revoke update (pk) on t1 from a;
+show grants for a;
+Grants for a
+GRANT USAGE ON *.* TO `a`
+GRANT SELECT (`i`) ON `test`.`t1` TO `a`
+drop role a;
+drop table t1;
+#
# End of 10.3 tests
#
diff --git a/mysql-test/suite/roles/role_grant_propagate.test b/mysql-test/suite/roles/role_grant_propagate.test
index bf20bc00809..02d451f0afd 100644
--- a/mysql-test/suite/roles/role_grant_propagate.test
+++ b/mysql-test/suite/roles/role_grant_propagate.test
@@ -197,5 +197,16 @@ drop role admin;
drop database crm;
--echo #
+--echo # MDEV-30526 Assertion `rights == merged->cols' failed in update_role_columns
+--echo #
+create table t1 ( pk int, i int);
+create role a;
+grant select (i), update (pk) on t1 to a;
+revoke update (pk) on t1 from a;
+show grants for a;
+drop role a;
+drop table t1;
+
+--echo #
--echo # End of 10.3 tests
--echo #
diff --git a/sql/sql_acl.cc b/sql/sql_acl.cc
index c6b1631523c..54ad81f94ce 100644
--- a/sql/sql_acl.cc
+++ b/sql/sql_acl.cc
@@ -6550,6 +6550,7 @@ static int update_role_columns(GRANT_TABLE *merged,
}
}
+restart:
for (uint i=0 ; i < mh->records ; i++)
{
GRANT_COLUMN *col = (GRANT_COLUMN *)my_hash_element(mh, i);
@@ -6558,6 +6559,7 @@ static int update_role_columns(GRANT_TABLE *merged,
{
changed= 1;
my_hash_delete(mh, (uchar*)col);
+ goto restart;
}
}
DBUG_ASSERT(rights == merged->cols);