List:Commits« Previous MessageNext Message »
From:Luis Soares Date:October 11 2010 2:12pm
Subject:bzr commit into mysql-5.5-bugteam branch (luis.soares:3232)
View as plain text  
#At file:///home/lsoares/Workspace/bzr/work/tests/mysql-5.5-bugteam/ based on revid:li-bing.song@stripped

 3232 Luis Soares	2010-10-11
      Fix for crash in mysqld --verbose --help while initializing option
      for --init-rpl-role.
      
      Problem: There are two variables involved in this issue,
      rpl_status and rpl_role_type. The former is an array containing
      the description of the possible values for the latter.
      
      rpl_status is declared as an enumeration and is stored in a 4
      bytes integer. On the other hand, my_getopt, reads enum values
      into a ulong:
      
        *(ulong*)value= arg;
      
      In some cases, this can overwriting the memory for used for
      rpl_role_type, corrupting the first entry in the array.
      
      Fix: We fix this by re-declaring rpl_status as a ulong, so that it
      has space to accommodate the value "parsed" in my_getopt .

    modified:
      sql/repl_failsafe.cc
      sql/repl_failsafe.h
=== modified file 'sql/repl_failsafe.cc'
--- a/sql/repl_failsafe.cc	2010-07-23 20:13:36 +0000
+++ b/sql/repl_failsafe.cc	2010-10-11 14:12:56 +0000
@@ -41,7 +41,7 @@
 #define SLAVE_ERRMSG_SIZE (FN_REFLEN+64)
 
 
-RPL_STATUS rpl_status=RPL_NULL;
+ulong rpl_status=RPL_NULL;
 mysql_mutex_t LOCK_rpl_status;
 mysql_cond_t COND_rpl_status;
 HASH slave_list;
@@ -56,6 +56,7 @@ const char* rpl_status_type[]=
   "RECOVERY_CAPTAIN","NULL",NullS
 };
 
+
 static Slave_log_event* find_slave_event(IO_CACHE* log,
 					 const char* log_file_name,
 					 char* errmsg);
@@ -68,7 +69,7 @@ static Slave_log_event* find_slave_event
   functions like register_slave()) are working.
 */
 
-void change_rpl_status(RPL_STATUS from_status, RPL_STATUS to_status)
+void change_rpl_status(ulong from_status, ulong to_status)
 {
   mysql_mutex_lock(&LOCK_rpl_status);
   if (rpl_status == from_status || rpl_status == RPL_ANY)

=== modified file 'sql/repl_failsafe.h'
--- a/sql/repl_failsafe.h	2010-07-23 20:13:36 +0000
+++ b/sql/repl_failsafe.h	2010-10-11 14:12:56 +0000
@@ -26,7 +26,7 @@ typedef enum {RPL_AUTH_MASTER=0,RPL_IDLE
 	      RPL_LOST_SOLDIER,RPL_TROOP_SOLDIER,
 	      RPL_RECOVERY_CAPTAIN,RPL_NULL /* inactive */,
 	      RPL_ANY /* wild card used by change_rpl_status */ } RPL_STATUS;
-extern RPL_STATUS rpl_status;
+extern ulong rpl_status;
 
 extern mysql_mutex_t LOCK_rpl_status;
 extern mysql_cond_t COND_rpl_status;
@@ -34,7 +34,7 @@ extern TYPELIB rpl_role_typelib;
 extern const char* rpl_role_type[], *rpl_status_type[];
 
 pthread_handler_t handle_failsafe_rpl(void *arg);
-void change_rpl_status(RPL_STATUS from_status, RPL_STATUS to_status);
+void change_rpl_status(ulong from_status, ulong to_status);
 int find_recovery_captain(THD* thd, MYSQL* mysql);
 int update_slave_list(MYSQL* mysql, Master_info* mi);
 


Attachment: [text/bzr-bundle] bzr/luis.soares@oracle.com-20101011141256-7os72af6mfdyquop.bundle
Thread
bzr commit into mysql-5.5-bugteam branch (luis.soares:3232) Luis Soares11 Oct