diff options
author | unknown <thek@adventure.(none)> | 2007-11-26 19:09:40 +0100 |
---|---|---|
committer | unknown <thek@adventure.(none)> | 2007-11-26 19:09:40 +0100 |
commit | 1ddb4722f4194691564396da05b09fe783d5b5de (patch) | |
tree | fc000ba6241f99748de9f672d6a2a736a5e7ee65 /mysql-test/r/grant.result | |
parent | 5254686e535d2a1670a5600dbe3e88fda81eefa3 (diff) | |
download | mariadb-git-1ddb4722f4194691564396da05b09fe783d5b5de.tar.gz |
Bug#16470 crash on grant if old grant tables
Loading 4.1 into 5.0 or 5.1 failed silently because procs_priv table missing.
This caused the server to crash on any attempt to store new grants because
of uninitialized structures.
This patch breaks up the grant loading function into two phases to allow
for procs_priv table to fail with an warning instead of crashing the server.
mysql-test/r/grant.result:
Test case
mysql-test/t/grant.test:
Test case making sure that FLUSH PRIVILEGES doesn't crash the server if
procs_priv is removed.
sql/sql_acl.cc:
- Refactored grant_reload into two phases: 1. open and lock tables_priv and
columns_priv tables, read the data, close tables. 2. open and lock
procs_priv, read data, close table. Since the tables are independant of
each other there will be no race conditions and it will be possible to
handle situations where the procs_priv table isn't present.
- Refactored the helper function grant_load into new grant_load (without
procs_priv table) and grant_load_procs_priv.
sql/sql_parse.cc:
- Changed comment style to doxygen style.
Diffstat (limited to 'mysql-test/r/grant.result')
-rw-r--r-- | mysql-test/r/grant.result | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/mysql-test/r/grant.result b/mysql-test/r/grant.result index 0d4dad39882..7a7e90b2280 100644 --- a/mysql-test/r/grant.result +++ b/mysql-test/r/grant.result @@ -1223,3 +1223,22 @@ drop user юзер_юзер@localhost; grant select on test.* to очень_длинный_юзер@localhost; ERROR HY000: String 'очень_длинный_юзер' is too long for user name (should be no longer than 16) set names default; +FLUSH PRIVILEGES without procs_priv table. +RENAME TABLE mysql.procs_priv TO mysql.procs_gone; +FLUSH PRIVILEGES; +Warnings: +Error 1146 Table 'mysql.procs_priv' doesn't exist +Error 1547 Cannot load from mysql.mysql.procs_priv. The table is probably corrupted +Assigning privileges without procs_priv table. +CREATE DATABASE mysqltest1; +CREATE PROCEDURE mysqltest1.test() SQL SECURITY DEFINER +SELECT 1; +GRANT EXECUTE ON FUNCTION mysqltest1.test TO mysqltest_1@localhost; +ERROR 42S02: Table 'mysql.procs_priv' doesn't exist +GRANT ALL PRIVILEGES ON test.* TO mysqltest_1@localhost; +CALL mysqltest1.test(); +1 +1 +DROP DATABASE mysqltest1; +RENAME TABLE mysql.procs_gone TO mysql.procs_priv; +FLUSH PRIVILEGES; |