Commit 51880686 authored by Georgi Kodinov's avatar Georgi Kodinov

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.
parent b5c258a8
...@@ -455,6 +455,13 @@ static void DbugParse(CODE_STATE *cs, const char *control) ...@@ -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_() ...@@ -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'; ...@@ -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'; ...@@ -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
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment