[asterisk-dev] [Code Review] Delay the destruction of an ast_filestream structure until the frame embedded within is freed.

Russell Bryant russell at digium.com
Tue Nov 11 17:44:46 CST 2008


-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
http://reviewboard.digium.com/r/46/#review123
-----------------------------------------------------------



branches/1.4/include/asterisk/file.h
<http://reviewboard.digium.com/r/46/#comment214>

    Go ahead and add the \arg doxygen tag.  Otherwise, doxygen will generate a warning about undocumented arguments



branches/1.4/main/file.c
<http://reviewboard.digium.com/r/46/#comment215>

    I'm not sure why all of this is needed.  ast_closestream() should be able to just be a single ao2_ref(f, -1).
    
    If it was possible for ast_closestream() to get called on the same stream more than once, then there is some seriously broken code, as that would have caused a number of problems in trying to free memory more than once.


- Russell


On 2008-11-11 13:51:07, Mark Michelson wrote:
> 
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> http://reviewboard.digium.com/r/46/
> -----------------------------------------------------------
> 
> (Updated 2008-11-11 13:51:07)
> 
> 
> Review request for Asterisk Developers and Russell Bryant.
> 
> 
> Summary
> -------
> 
> This patch is to alleviate a memory corruption problem observed on a production system. Valgrind showed that there were invalid accesses to frames in the function ast_frame_free. It appears that the problem had to do with the fact that the frames were allocated as part of an ast_filestream structure. After the ast_filestream is freed, we still attempt to operate on the frame that was part of it.
> 
> This patch solves the problem by marking frames which are part of an ast_filestream structure with a flag, AST_FRFLAG_FROM_FILESTREAM. If ast_filestream_close is called on a filestream whose frame is still flagged, then we will delay the destruction of the ast_filestream until ast_frfree is called on the frame.
> 
> I'm confident that this patch is correct, especially since similar measures have been taken with frames embedded in ast_dsp structures and ast_trans_pvt structures. The main concern I have is that I needed to repurpose a field in the ast_filestream structure to be used as a means of indicating that the ast_filestream had been requested to be destroyed. I chose the 'lastwriteformat' field for this and set it to -1 in the case that ast_filestream_close is called prior to the AST_FRFLAG_FROM_FILESTREAM being cleared from the embedded frame. It is important that we are sure that the lastwriteformat variable has no other legitimate reason to be set to -1. Grepping the source shows that the only time this variable is used is in the function ast_writestream. It gets set to the subclass of a voice frame if the frame's format is not one for which we have set up a translator. All voice frame subclasses are non-negative to the best of my knowledge.
> 
> 
> Diffs
> -----
> 
>   branches/1.4/include/asterisk/file.h 155768 
>   branches/1.4/include/asterisk/frame.h 155768 
>   branches/1.4/main/file.c 155768 
>   branches/1.4/main/frame.c 155768 
> 
> Diff: http://reviewboard.digium.com/r/46/diff
> 
> 
> Testing
> -------
> 
> I have done some simple file playbacks just to be sure that there is no horrible breakage.
> 
> 
> Thanks,
> 
> Mark
> 
>




More information about the asterisk-dev mailing list