MDEV-31636 Memory leak in Sys_var_gtid_binlog_state::do_check()
Move memory allocations performed during Sys_var_gtid_binlog_state::do_check to Sys_var_gtid_binlog_state::global_update where they will be freed before the latter method returns.
This commit is contained in:
parent
d67c88946f
commit
f7c5182b7c
8
mysql-test/main/mdev-31636.result
Normal file
8
mysql-test/main/mdev-31636.result
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
RESET MASTER;
|
||||||
|
SET
|
||||||
|
@@global.gtid_binlog_state='1-1-101,2-1-2002',
|
||||||
|
@@global.slave_parallel_mode=x;
|
||||||
|
ERROR 42000: Variable 'slave_parallel_mode' can't be set to the value of 'x'
|
||||||
|
SELECT @@global.gtid_binlog_state;
|
||||||
|
@@global.gtid_binlog_state
|
||||||
|
|
7
mysql-test/main/mdev-31636.test
Normal file
7
mysql-test/main/mdev-31636.test
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
--source include/have_log_bin.inc
|
||||||
|
RESET MASTER;
|
||||||
|
--error ER_WRONG_VALUE_FOR_VAR
|
||||||
|
SET
|
||||||
|
@@global.gtid_binlog_state='1-1-101,2-1-2002',
|
||||||
|
@@global.slave_parallel_mode=x;
|
||||||
|
SELECT @@global.gtid_binlog_state;
|
@ -2016,15 +2016,6 @@ struct gtid_binlog_state_data { rpl_gtid *list; uint32 list_len; };
|
|||||||
bool
|
bool
|
||||||
Sys_var_gtid_binlog_state::do_check(THD *thd, set_var *var)
|
Sys_var_gtid_binlog_state::do_check(THD *thd, set_var *var)
|
||||||
{
|
{
|
||||||
String str, *res;
|
|
||||||
struct gtid_binlog_state_data *data;
|
|
||||||
rpl_gtid *list;
|
|
||||||
uint32 list_len;
|
|
||||||
|
|
||||||
DBUG_ASSERT(var->type == OPT_GLOBAL);
|
|
||||||
|
|
||||||
if (!(res= var->value->val_str(&str)))
|
|
||||||
return true;
|
|
||||||
if (thd->in_active_multi_stmt_transaction())
|
if (thd->in_active_multi_stmt_transaction())
|
||||||
{
|
{
|
||||||
my_error(ER_CANT_DO_THIS_DURING_AN_TRANSACTION, MYF(0));
|
my_error(ER_CANT_DO_THIS_DURING_AN_TRANSACTION, MYF(0));
|
||||||
@ -2040,6 +2031,31 @@ Sys_var_gtid_binlog_state::do_check(THD *thd, set_var *var)
|
|||||||
my_error(ER_BINLOG_MUST_BE_EMPTY, MYF(0));
|
my_error(ER_BINLOG_MUST_BE_EMPTY, MYF(0));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool
|
||||||
|
Sys_var_gtid_binlog_state::global_update(THD *thd, set_var *var)
|
||||||
|
{
|
||||||
|
DBUG_ASSERT(var->type == OPT_GLOBAL);
|
||||||
|
|
||||||
|
if (!var->value)
|
||||||
|
{
|
||||||
|
my_error(ER_NO_DEFAULT, MYF(0), var->var->name.str);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool result;
|
||||||
|
String str, *res;
|
||||||
|
struct gtid_binlog_state_data *data;
|
||||||
|
rpl_gtid *list;
|
||||||
|
uint32 list_len;
|
||||||
|
|
||||||
|
DBUG_ASSERT(var->type == OPT_GLOBAL);
|
||||||
|
|
||||||
|
if (!(res= var->value->val_str(&str)))
|
||||||
|
return true;
|
||||||
if (res->length() == 0)
|
if (res->length() == 0)
|
||||||
{
|
{
|
||||||
list= NULL;
|
list= NULL;
|
||||||
@ -2061,31 +2077,13 @@ Sys_var_gtid_binlog_state::do_check(THD *thd, set_var *var)
|
|||||||
data->list= list;
|
data->list= list;
|
||||||
data->list_len= list_len;
|
data->list_len= list_len;
|
||||||
var->save_result.ptr= data;
|
var->save_result.ptr= data;
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool
|
|
||||||
Sys_var_gtid_binlog_state::global_update(THD *thd, set_var *var)
|
|
||||||
{
|
|
||||||
bool res;
|
|
||||||
|
|
||||||
DBUG_ASSERT(var->type == OPT_GLOBAL);
|
|
||||||
|
|
||||||
if (!var->value)
|
|
||||||
{
|
|
||||||
my_error(ER_NO_DEFAULT, MYF(0), var->var->name.str);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct gtid_binlog_state_data *data=
|
|
||||||
(struct gtid_binlog_state_data *)var->save_result.ptr;
|
|
||||||
mysql_mutex_unlock(&LOCK_global_system_variables);
|
mysql_mutex_unlock(&LOCK_global_system_variables);
|
||||||
res= (reset_master(thd, data->list, data->list_len, 0) != 0);
|
result= (reset_master(thd, data->list, data->list_len, 0) != 0);
|
||||||
mysql_mutex_lock(&LOCK_global_system_variables);
|
mysql_mutex_lock(&LOCK_global_system_variables);
|
||||||
my_free(data->list);
|
my_free(data->list);
|
||||||
my_free(data);
|
my_free(data);
|
||||||
return res;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user