diff options
author | Sergei Golubchik <serg@mariadb.org> | 2023-02-01 18:56:10 +0100 |
---|---|---|
committer | Sergei Golubchik <serg@mariadb.org> | 2023-02-21 23:22:56 +0100 |
commit | 2e6a9886a9f0aea55035dbdcf74bf09c0f7e2a30 (patch) | |
tree | 28c3ab511b65c7acdf9cc087b1192c1a3176a0ac | |
parent | 3c6f108540862ef91889ee2bf975fad64237dabb (diff) | |
download | mariadb-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.result | 13 | ||||
-rw-r--r-- | mysql-test/suite/roles/role_grant_propagate.test | 11 | ||||
-rw-r--r-- | sql/sql_acl.cc | 2 |
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); |