mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Bug #52629: memory leak from sys_var_thd_dbug in binlog.binlog_write_error
When re-setting (SET GLOBAL debug='') the GLOBAL debug settings the server was not freeing the data elements from the top (initial) frame before setting them to 0 without freeing the underlying memory. As these are global settings there's a chance that something is there already. Fixed by : 1. making sure the allocated data are cleaned up before re-setting them while parsing a debug string 2. making sure the stuff allocated in the global settings is freed on shutdown.
This commit is contained in:
10
dbug/dbug.c
10
dbug/dbug.c
@ -455,6 +455,13 @@ static void DbugParse(CODE_STATE *cs, const char *control)
|
|||||||
rel= control[0] == '+' || control[0] == '-';
|
rel= control[0] == '+' || control[0] == '-';
|
||||||
if ((!rel || (!stack->out_file && !stack->next)))
|
if ((!rel || (!stack->out_file && !stack->next)))
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
We need to free what's already in init_settings, because unlike
|
||||||
|
the thread related stack frames there's a chance that something
|
||||||
|
is in these variables already.
|
||||||
|
*/
|
||||||
|
if (stack == &init_settings)
|
||||||
|
FreeState(cs, stack, 0);
|
||||||
stack->flags= 0;
|
stack->flags= 0;
|
||||||
stack->delay= 0;
|
stack->delay= 0;
|
||||||
stack->maxdepth= 0;
|
stack->maxdepth= 0;
|
||||||
@ -1510,7 +1517,10 @@ void _db_end_()
|
|||||||
while ((discard= cs->stack))
|
while ((discard= cs->stack))
|
||||||
{
|
{
|
||||||
if (discard == &init_settings)
|
if (discard == &init_settings)
|
||||||
|
{
|
||||||
|
FreeState (cs, discard, 0);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
cs->stack= discard->next;
|
cs->stack= discard->next;
|
||||||
FreeState(cs, discard, 1);
|
FreeState(cs, discard, 1);
|
||||||
}
|
}
|
||||||
|
@ -10,3 +10,16 @@ set debug= '-P';
|
|||||||
select @@debug;
|
select @@debug;
|
||||||
@@debug
|
@@debug
|
||||||
T
|
T
|
||||||
|
#
|
||||||
|
# Bug #52629: memory leak from sys_var_thd_dbug in
|
||||||
|
# binlog.binlog_write_error
|
||||||
|
#
|
||||||
|
SET GLOBAL debug='d,injecting_fault_writing';
|
||||||
|
SELECT @@global.debug;
|
||||||
|
@@global.debug
|
||||||
|
d,injecting_fault_writing
|
||||||
|
SET GLOBAL debug='';
|
||||||
|
SELECT @@global.debug;
|
||||||
|
@@global.debug
|
||||||
|
|
||||||
|
End of 5.1 tests
|
||||||
|
@ -10,3 +10,16 @@ set debug= '+P';
|
|||||||
select @@debug;
|
select @@debug;
|
||||||
set debug= '-P';
|
set debug= '-P';
|
||||||
select @@debug;
|
select @@debug;
|
||||||
|
|
||||||
|
--echo #
|
||||||
|
--echo # Bug #52629: memory leak from sys_var_thd_dbug in
|
||||||
|
--echo # binlog.binlog_write_error
|
||||||
|
--echo #
|
||||||
|
|
||||||
|
SET GLOBAL debug='d,injecting_fault_writing';
|
||||||
|
SELECT @@global.debug;
|
||||||
|
SET GLOBAL debug='';
|
||||||
|
SELECT @@global.debug;
|
||||||
|
|
||||||
|
|
||||||
|
--echo End of 5.1 tests
|
||||||
|
Reference in New Issue
Block a user