← Back to team overview

maria-developers team mailing list archive

Re: bzr commit into MariaDB 5.1, with Maria 1.5:maria branch (knielsen:2686)

 

Sergei Golubchik <sergii@xxxxxxxxx> writes:

>> === modified file 'dbug/dbug.c'
>> --- a/dbug/dbug.c	2009-03-12 22:27:35 +0000
>> +++ b/dbug/dbug.c	2009-03-18 14:08:05 +0000
>> @@ -506,6 +506,7 @@ int DbugParse(CODE_STATE *cs, const char
>>    rel= control[0] == '+' || control[0] == '-';
>>    if ((!rel || (!stack->out_file && !stack->next)))
>>    {
>> +    FreeState(cs, stack, 0);
>
> you may be freeing uuninitialized data here.

Ok, that's not good, obviously.

> What are you trying to fix anyway ?

The leak from this Valgrind warning:

==28234== 51 bytes in 1 blocks are definitely lost in loss record 3 of 7
==28234==    at 0x4C22FAB: malloc (vg_replace_malloc.c:207)
==28234==    by 0xAA3452: DbugMalloc (dbug.c:2164)
==28234==    by 0xAA2864: ListAddDel (dbug.c:1489)
==28234==    by 0xAA009E: DbugParse (dbug.c:572)
==28234==    by 0xAA0A27: _db_set_init_ (dbug.c:913)
==28234==    by 0x66C4C3: mysqld_get_one_option (mysqld.cc:7942)
==28234==    by 0xA89E5C: handle_options (my_getopt.c:530)
==28234==    by 0x6720C4: get_options(int*, char**) (mysqld.cc:8524)
==28234==    by 0x672590: init_common_variables(char const*, int, char**, char const**) (mysqld.cc:3312)
==28234==    by 0x673EAB: main (mysqld.cc:4318)

If I remember correctly, it is init_settings.keywords that is not de-allocated
correctly when DbugParse is called multiple times.

Due to BUG#43418, mysql-test-run was not detecting all Valgrind warnings. And
after I fixed that bug, a number of additional warnings surfaced, this on
included.

If you have a better suggestion for silencing this leak, that would be
great. Otherwise I need to look a bit deeper, I admit I did not properly check
for the possibility of freeing uninitialised pointers.

>> @@ -1648,10 +1649,12 @@ static void FreeState(CODE_STATE *cs, st
>>      FreeList(state->processes);
>>    if (!is_shared(state, p_functions))
>>      FreeList(state->p_functions);
>> -  if (!is_shared(state, out_file))
>> +  if (!is_shared(state, out_file) &&
>> +      state->out_file != stderr && state->out_file != stdout)
>>      DBUGCloseFile(cs, state->out_file);
>>    (void) fflush(cs->stack->out_file);
>> -  if (state->prof_file)
>> +  if (state->prof_file &&
>> +      state->out_file != stderr && state->out_file != stdout)
>
> typo. you obviously want s/out_file/prof_file/g

Well spotted!

Thanks a lot, Sergei!

 - Kristian.



References