mirror of
https://github.com/MariaDB/server.git
synced 2025-08-01 03:47:19 +03:00
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 .
This commit is contained in:
@ -41,7 +41,7 @@
|
|||||||
#define SLAVE_ERRMSG_SIZE (FN_REFLEN+64)
|
#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_mutex_t LOCK_rpl_status;
|
||||||
mysql_cond_t COND_rpl_status;
|
mysql_cond_t COND_rpl_status;
|
||||||
HASH slave_list;
|
HASH slave_list;
|
||||||
@ -68,7 +68,7 @@ static Slave_log_event* find_slave_event(IO_CACHE* log,
|
|||||||
functions like register_slave()) are working.
|
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);
|
mysql_mutex_lock(&LOCK_rpl_status);
|
||||||
if (rpl_status == from_status || rpl_status == RPL_ANY)
|
if (rpl_status == from_status || rpl_status == RPL_ANY)
|
||||||
|
@ -26,7 +26,7 @@ typedef enum {RPL_AUTH_MASTER=0,RPL_IDLE_SLAVE,RPL_ACTIVE_SLAVE,
|
|||||||
RPL_LOST_SOLDIER,RPL_TROOP_SOLDIER,
|
RPL_LOST_SOLDIER,RPL_TROOP_SOLDIER,
|
||||||
RPL_RECOVERY_CAPTAIN,RPL_NULL /* inactive */,
|
RPL_RECOVERY_CAPTAIN,RPL_NULL /* inactive */,
|
||||||
RPL_ANY /* wild card used by change_rpl_status */ } RPL_STATUS;
|
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_mutex_t LOCK_rpl_status;
|
||||||
extern mysql_cond_t COND_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[];
|
extern const char* rpl_role_type[], *rpl_status_type[];
|
||||||
|
|
||||||
pthread_handler_t handle_failsafe_rpl(void *arg);
|
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 find_recovery_captain(THD* thd, MYSQL* mysql);
|
||||||
int update_slave_list(MYSQL* mysql, Master_info* mi);
|
int update_slave_list(MYSQL* mysql, Master_info* mi);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user