From: Li-Bing.Song Date: October 21 2010 3:12am Subject: bzr commit into mysql-5.1-bugteam branch (Li-Bing.Song:3530) Bug#27606 List-Archive: http://lists.mysql.com/commits/121431 X-Bug: 27606 Message-Id: <201010210312.o9L3Cpmg010156@localhost6.localdomain6> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============8807736290569743281==" --===============8807736290569743281== MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Content-Disposition: inline #At file:///home/anders/Work/bzrwork/wt1/mysql-5.1-bugteam/ based on revid:luis.soares@stripped 3530 Li-Bing.Song@stripped 2010-10-21 Bug#27606 GRANT statement should be replicated with DEFINER information "Grantor" columns' data is lost when replicating mysql.tables_priv. Slave SQL thread used its default user ''@'' as the grantor of GRANT|REVOKE statements executing on it. In this patch, current user is put in query log event for all GRANT and REVOKE statement, SQL thread uses the user in query log event as grantor. @ mysql-test/suite/rpl/r/rpl_do_grant.result Add test for this bug. @ mysql-test/suite/rpl/t/rpl_do_grant.test Add test for this bug. @ sql/log_event.cc Refactoring THD::current_user_used and related functions. current_user_used is used to judge if current user should be binlogged in query log event. So it is better to call it m_binlog_invoker. The related functions are renamed too. @ sql/sql_class.cc Refactoring THD::current_user_used and related functions. current_user_used is used to judge if current user should be binlogged in query log event. So it is better to call it m_binlog_invoker. The related functions are renamed too. @ sql/sql_class.h Refactoring THD::current_user_used and related functions. current_user_used is used to judge if current user should be binlogged in query log event. So it is better to call it m_binlog_invoker. The related functions are renamed too. @ sql/sql_parse.cc Call binlog_invoker() for GRANT and REVOKE statements. modified: mysql-test/suite/rpl/r/rpl_do_grant.result mysql-test/suite/rpl/t/rpl_do_grant.test sql/log_event.cc sql/sql_class.cc sql/sql_class.h sql/sql_parse.cc === modified file 'mysql-test/suite/rpl/r/rpl_do_grant.result' --- a/mysql-test/suite/rpl/r/rpl_do_grant.result 2010-05-13 15:40:31 +0000 +++ b/mysql-test/suite/rpl/r/rpl_do_grant.result 2010-10-21 03:12:48 +0000 @@ -260,4 +260,27 @@ Log_name Pos Event_type Server_id End_lo master-bin.000001 # Query # # use `test`; grant all on *.* to foo@"1.2.3.4" master-bin.000001 # Query # # use `test`; revoke all privileges, grant option from "foo" DROP USER foo@"1.2.3.4"; + +# Bug#27606 GRANT statement should be replicated with DEFINER information +stop slave; +drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; +reset master; +reset slave; +drop table if exists t1,t2,t3,t4,t5,t6,t7,t8,t9; +start slave; +GRANT SELECT, INSERT ON mysql.user TO user_bug27606@localhost; +SELECT Grantor FROM mysql.tables_priv WHERE User='user_bug27606'; +Grantor +root@localhost +SELECT Grantor FROM mysql.tables_priv WHERE User='user_bug27606'; +Grantor +root@localhost +REVOKE SELECT ON mysql.user FROM user_bug27606@localhost; +SELECT Grantor FROM mysql.tables_priv WHERE User='user_bug27606'; +Grantor +root@localhost +SELECT Grantor FROM mysql.tables_priv WHERE User='user_bug27606'; +Grantor +root@localhost +DROP USER user_bug27606@localhost; "End of test" === modified file 'mysql-test/suite/rpl/t/rpl_do_grant.test' --- a/mysql-test/suite/rpl/t/rpl_do_grant.test 2010-05-13 15:40:31 +0000 +++ b/mysql-test/suite/rpl/t/rpl_do_grant.test 2010-10-21 03:12:48 +0000 @@ -355,4 +355,25 @@ revoke all privileges, grant option from DROP USER foo@"1.2.3.4"; -- sync_slave_with_master +--echo +--echo # Bug#27606 GRANT statement should be replicated with DEFINER information +--connection master +--source include/master-slave-reset.inc +--connection master +GRANT SELECT, INSERT ON mysql.user TO user_bug27606@localhost; + +SELECT Grantor FROM mysql.tables_priv WHERE User='user_bug27606'; +sync_slave_with_master; +SELECT Grantor FROM mysql.tables_priv WHERE User='user_bug27606'; + +--connection master +REVOKE SELECT ON mysql.user FROM user_bug27606@localhost; +SELECT Grantor FROM mysql.tables_priv WHERE User='user_bug27606'; +sync_slave_with_master; +SELECT Grantor FROM mysql.tables_priv WHERE User='user_bug27606'; + +--connection master +DROP USER user_bug27606@localhost; + +--source include/master-slave-end.inc --echo "End of test" === modified file 'sql/log_event.cc' --- a/sql/log_event.cc 2010-10-13 07:25:43 +0000 +++ b/sql/log_event.cc 2010-10-21 03:12:48 +0000 @@ -2314,7 +2314,7 @@ bool Query_log_event::write(IO_CACHE* fi start+= 4; } - if (thd && thd->is_current_user_used()) + if (thd && thd->need_binlog_invoker()) { LEX_STRING user; LEX_STRING host; === modified file 'sql/sql_class.cc' --- a/sql/sql_class.cc 2010-09-01 17:38:34 +0000 +++ b/sql/sql_class.cc 2010-10-21 03:12:48 +0000 @@ -738,7 +738,7 @@ THD::THD() thr_lock_owner_init(&main_lock_id, &lock_info); m_internal_handler= NULL; - current_user_used= FALSE; + m_binlog_invoker= FALSE; memset(&invoker_user, 0, sizeof(invoker_user)); memset(&invoker_host, 0, sizeof(invoker_host)); } @@ -1247,7 +1247,7 @@ void THD::cleanup_after_query() where= THD::DEFAULT_WHERE; /* reset table map for multi-table update */ table_map_for_update= 0; - clean_current_user_used(); + m_binlog_invoker= FALSE; } @@ -3281,7 +3281,7 @@ void THD::set_query(char *query_arg, uin void THD::get_definer(LEX_USER *definer) { - set_current_user_used(); + binlog_invoker(); #if !defined(MYSQL_CLIENT) && defined(HAVE_REPLICATION) if (slave_thread && has_invoker()) { === modified file 'sql/sql_class.h' --- a/sql/sql_class.h 2010-08-18 04:56:06 +0000 +++ b/sql/sql_class.h 2010-10-21 03:12:48 +0000 @@ -2344,9 +2344,8 @@ public: Protected with LOCK_thd_data mutex. */ void set_query(char *query_arg, uint32 query_length_arg); - void set_current_user_used() { current_user_used= TRUE; } - bool is_current_user_used() { return current_user_used; } - void clean_current_user_used() { current_user_used= FALSE; } + void binlog_invoker() { m_binlog_invoker= TRUE; } + bool need_binlog_invoker() { return m_binlog_invoker; } void get_definer(LEX_USER *definer); void set_invoker(const LEX_STRING *user, const LEX_STRING *host) { @@ -2384,7 +2383,7 @@ private: Current user will be binlogged into Query_log_event if current_user_used is TRUE; It will be stored into invoker_host and invoker_user by SQL thread. */ - bool current_user_used; + bool m_binlog_invoker; /** It points to the invoker in the Query_log_event. === modified file 'sql/sql_parse.cc' --- a/sql/sql_parse.cc 2010-08-18 04:56:06 +0000 +++ b/sql/sql_parse.cc 2010-10-21 03:12:48 +0000 @@ -3913,6 +3913,10 @@ end_with_restore_list: if (check_access(thd, UPDATE_ACL, "mysql", 0, 1, 1, 0) && check_global_access(thd,CREATE_USER_ACL)) break; + + /* Replicate current user as grantor */ + thd->binlog_invoker(); + /* Conditionally writes to binlog */ if (!(res = mysql_revoke_all(thd, lex->users_list))) my_ok(thd); @@ -3933,6 +3937,9 @@ end_with_restore_list: is_schema_db(select_lex->db) : 0)) goto error; + /* Replicate current user as grantor */ + thd->binlog_invoker(); + if (thd->security_ctx->user) // If not replication { LEX_USER *user, *tmp_user; --===============8807736290569743281== MIME-Version: 1.0 Content-Type: text/bzr-bundle; charset="us-ascii"; name="bzr/li-bing.song@stripped" Content-Transfer-Encoding: 7bit Content-Disposition: inline # Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: li-bing.song@stripped # target_branch: file:///home/anders/Work/bzrwork/wt1/mysql-5.1-\ # bugteam/ # testament_sha1: 41568e11ace858f0dac2b7d136d8aa53548b2170 # timestamp: 2010-10-21 11:12:51 +0800 # base_revision_id: luis.soares@stripped\ # 47wf2yswi8k5g3y4 # # Begin bundle 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 --===============8807736290569743281==--