Commit 93efc7e2 authored by Ramil Kalimullin's avatar Ramil Kalimullin

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.
parent a186085a
#
# 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;
--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; ...@@ -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) ...@@ -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; ...@@ -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( ...@@ -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) ...@@ -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 "
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment