#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;
This is overwriting the memory 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:50:14 +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;
@@ -68,7 +68,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:50:14 +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-20101011145014-r1c68yc4me1qsm5f.bundle
| Thread |
|---|
| • bzr commit into mysql-5.5-bugteam branch (luis.soares:3232) | Luis Soares | 11 Oct |