Fix for bug #58669: read_only not enforced on 5.5.x
Problem: "read-only" option ignored if it's enabled in the command line (or in the config file). Fix: sync opt_readonly (which is used for checks) with read_only (global var) when all server options are handled.
This commit is contained in:
parent
a186085a07
commit
93efc7e2c4
17
mysql-test/r/bug58669.result
Normal file
17
mysql-test/r/bug58669.result
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
#
|
||||||
|
# Bug#58669: read_only not enforced on 5.5.x
|
||||||
|
#
|
||||||
|
CREATE USER user1@localhost;
|
||||||
|
CREATE DATABASE db1;
|
||||||
|
GRANT ALL PRIVILEGES ON db1.* TO user1@localhost;
|
||||||
|
CREATE TABLE db1.t1(a INT);
|
||||||
|
SELECT CURRENT_USER();
|
||||||
|
CURRENT_USER()
|
||||||
|
user1@localhost
|
||||||
|
SHOW VARIABLES LIKE "%read_only%";
|
||||||
|
Variable_name Value
|
||||||
|
read_only ON
|
||||||
|
INSERT INTO db1.t1 VALUES (1);
|
||||||
|
ERROR HY000: The MySQL server is running with the --read-only option so it cannot execute this statement
|
||||||
|
DROP DATABASE db1;
|
||||||
|
DROP USER user1@localhost;
|
1
mysql-test/t/bug58669-master.opt
Normal file
1
mysql-test/t/bug58669-master.opt
Normal file
@ -0,0 +1 @@
|
|||||||
|
--read-only
|
22
mysql-test/t/bug58669.test
Normal file
22
mysql-test/t/bug58669.test
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
--source include/not_embedded.inc
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Bug#58669: read_only not enforced on 5.5.x
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
CREATE USER user1@localhost;
|
||||||
|
CREATE DATABASE db1;
|
||||||
|
GRANT ALL PRIVILEGES ON db1.* TO user1@localhost;
|
||||||
|
CREATE TABLE db1.t1(a INT);
|
||||||
|
|
||||||
|
connect (con1,localhost,user1,,);
|
||||||
|
connection con1;
|
||||||
|
SELECT CURRENT_USER();
|
||||||
|
SHOW VARIABLES LIKE "%read_only%";
|
||||||
|
--error ER_OPTION_PREVENTS_STATEMENT
|
||||||
|
INSERT INTO db1.t1 VALUES (1);
|
||||||
|
|
||||||
|
connection default;
|
||||||
|
disconnect con1;
|
||||||
|
DROP DATABASE db1;
|
||||||
|
DROP USER user1@localhost;
|
@ -410,7 +410,8 @@ handlerton *heap_hton;
|
|||||||
handlerton *myisam_hton;
|
handlerton *myisam_hton;
|
||||||
handlerton *partition_hton;
|
handlerton *partition_hton;
|
||||||
|
|
||||||
my_bool opt_readonly= 0, use_temp_pool, relay_log_purge;
|
my_bool read_only= 0, opt_readonly= 0;
|
||||||
|
my_bool use_temp_pool, relay_log_purge;
|
||||||
my_bool relay_log_recovery;
|
my_bool relay_log_recovery;
|
||||||
my_bool opt_sync_frm, opt_allow_suspicious_udfs;
|
my_bool opt_sync_frm, opt_allow_suspicious_udfs;
|
||||||
my_bool opt_secure_auth= 0;
|
my_bool opt_secure_auth= 0;
|
||||||
@ -7342,6 +7343,8 @@ static int get_options(int *argc_ptr, char ***argv_ptr)
|
|||||||
test(global_system_variables.optimizer_switch &
|
test(global_system_variables.optimizer_switch &
|
||||||
OPTIMIZER_SWITCH_ENGINE_CONDITION_PUSHDOWN);
|
OPTIMIZER_SWITCH_ENGINE_CONDITION_PUSHDOWN);
|
||||||
|
|
||||||
|
opt_readonly= read_only;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -107,7 +107,8 @@ extern my_bool opt_safe_show_db, opt_local_infile, opt_myisam_use_mmap;
|
|||||||
extern my_bool opt_slave_compressed_protocol, use_temp_pool;
|
extern my_bool opt_slave_compressed_protocol, use_temp_pool;
|
||||||
extern ulong slave_exec_mode_options;
|
extern ulong slave_exec_mode_options;
|
||||||
extern ulonglong slave_type_conversions_options;
|
extern ulonglong slave_type_conversions_options;
|
||||||
extern my_bool opt_readonly, lower_case_file_system;
|
extern my_bool read_only, opt_readonly;
|
||||||
|
extern my_bool lower_case_file_system;
|
||||||
extern my_bool opt_enable_named_pipe, opt_sync_frm, opt_allow_suspicious_udfs;
|
extern my_bool opt_enable_named_pipe, opt_sync_frm, opt_allow_suspicious_udfs;
|
||||||
extern my_bool opt_secure_auth;
|
extern my_bool opt_secure_auth;
|
||||||
extern char* opt_secure_file_priv;
|
extern char* opt_secure_file_priv;
|
||||||
|
@ -1436,7 +1436,6 @@ static Sys_var_ulong Sys_read_buff_size(
|
|||||||
VALID_RANGE(IO_SIZE*2, INT_MAX32), DEFAULT(128*1024),
|
VALID_RANGE(IO_SIZE*2, INT_MAX32), DEFAULT(128*1024),
|
||||||
BLOCK_SIZE(IO_SIZE));
|
BLOCK_SIZE(IO_SIZE));
|
||||||
|
|
||||||
static my_bool read_only;
|
|
||||||
static bool check_read_only(sys_var *self, THD *thd, set_var *var)
|
static bool check_read_only(sys_var *self, THD *thd, set_var *var)
|
||||||
{
|
{
|
||||||
/* Prevent self dead-lock */
|
/* Prevent self dead-lock */
|
||||||
@ -1520,6 +1519,16 @@ static bool fix_read_only(sys_var *self, THD *thd, enum_var_type type)
|
|||||||
read_only= opt_readonly;
|
read_only= opt_readonly;
|
||||||
DBUG_RETURN(result);
|
DBUG_RETURN(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
The read_only boolean is always equal to the opt_readonly boolean except
|
||||||
|
during fix_read_only(); when that function is entered, opt_readonly is
|
||||||
|
the pre-update value and read_only is the post-update value.
|
||||||
|
fix_read_only() compares them and runs needed operations for the
|
||||||
|
transition (especially when transitioning from false to true) and
|
||||||
|
synchronizes both booleans in the end.
|
||||||
|
*/
|
||||||
static Sys_var_mybool Sys_readonly(
|
static Sys_var_mybool Sys_readonly(
|
||||||
"read_only",
|
"read_only",
|
||||||
"Make all non-temporary tables read-only, with the exception for "
|
"Make all non-temporary tables read-only, with the exception for "
|
||||||
|
Loading…
x
Reference in New Issue
Block a user