[asterisk-dev] murf: branch 1.4 r152535 - in /branches/1.4: apps/ funcs/ include/asterisk/ res/

Mark Michelson mmichelson at digium.com
Mon Nov 3 15:55:50 CST 2008


Russell Bryant wrote:
> Mark Michelson wrote:
>>>> -       ast_set2_flag(c, autoloopflag, AST_FLAG_IN_AUTOLOOP);
>>>> -       ast_clear_flag(c, AST_FLAG_BRIDGE_HANGUP_RUN); /* from one round
>>>> to the next, make sure this gets cleared */
>>>> -       pbx_destroy(c->pbx);
>>>> -       c->pbx = NULL;
>>>> -       if (res != AST_PBX_KEEPALIVE)
>>>> +       if (res != AST_PBX_KEEPALIVE) {
>>>> +               ast_set2_flag(c, autoloopflag, AST_FLAG_IN_AUTOLOOP);
>>>> +               ast_clear_flag(c, AST_FLAG_BRIDGE_HANGUP_RUN); /* from
>>>> one round to the next, make sure this gets cleared */
>>>> +               pbx_destroy(c->pbx);
>>>> +               c->pbx = NULL;
>>>>                 ast_hangup(c);
>>>> +       }
>>>>         return 0;
>>>>  }
>>>>
> 
>>> You are correct that the existing code is not safe.  However, in the 
>>> existing code, you have the potential for a crash.  In your modified 
>>> version, you have a memory leak, as the ast_pbx isn't getting cleared up 
>>> like it is supposed to.
>>>
>> For my education, where is the memory leak? What else is required besides 
>> pbx_destroy()?
> 
> Previously, when code returned KEEPALIVE, it was expecting the PBX 
> thread to destroy the channel's ast_pbx object.  In this modified code, 
> pbx_destroy() is no longer being called.  The catch is, it's really not 
> safe to touch the channel at all here ...
> 

Ah, my mind had turned != into ==. Thanks.

Mark Michelson



More information about the asterisk-dev mailing list