[asterisk-dev] [Code Review]: automagically set a pointer to null after it is freed with ast_free
wdoekes
reviewboard at asterisk.org
Mon Sep 19 08:27:38 CDT 2011
> On Sept. 19, 2011, 8:16 a.m., wdoekes wrote:
> > trunk/res/res_agi.c, lines 3196-3199
> > <https://reviewboard.asterisk.org/r/1441/diff/2/?file=20685#file20685line3196>
> >
> > Er. There is no reason for these casts. They were originally here because of the const nature of e->summary and friends.
> >
> > (The compiler would warn "warning: passing argument 1 of ‘free’ discards qualifiers from pointer target type".)
> >
> > But, ast_free already casts the arguments to void*, so the warning is gone anyway.
> >
> > Replace with ast_free(e->summary) and remove the "*((char **) &e->summary) = NULL;" below.
> >
> > P.S. schmidts: you'll also find these casts in func_odbc and possibly other modules that you might have missed because of missing deps.
P.S.2. You'd need to replace a = NULL with something like:
*(void**)&a = NULL;
- wdoekes
-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
https://reviewboard.asterisk.org/r/1441/#review4358
-----------------------------------------------------------
On Sept. 19, 2011, 3:23 a.m., schmidts wrote:
>
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> https://reviewboard.asterisk.org/r/1441/
> -----------------------------------------------------------
>
> (Updated Sept. 19, 2011, 3:23 a.m.)
>
>
> Review request for Asterisk Developers and David Vossel.
>
>
> Summary
> -------
>
> first of all, this is just an idea so be friendly ;)
>
> i have thought about setting a pointer to NULL after it is freed to
> avoid segfaults and double free corruptions.
>
> the most important change is to replace the define of ast_free to a
> macro which just looks like this:
>
> #define ast_free(x) ({ free((void *)x); x = NULL; })
>
> and also to keep it working proberly change the define of ast_free_ptr
> to free instead of ast_free.
>
> the same change happens in astmm.h for malloc debugging calls:
>
> #define ast_free(a) ({ __ast_free((void *) a,__FILE__, __LINE__, __PRETTY_FUNCTION__); a = NULL; })
>
> after doing this changes i have seen a lot of places where a pointer is
> cast at the ast_free call to remove the const state of it.
> you can see in the diff all this places where this happens but i think
> just cast it into void within the macro makes more sense.
> because of this small changes the diff is so big, but its the same change on every part of it, except utils.h and astmm.h
>
> only on three places i dont know how to handle this things:
> in res_agi.c i had to replace ast_free with free to make it compile, i am sure there would be another way to solve this but i need some help with this.
> in config.c i have the same problem like in res_agi.c
>
> format_cap.c is allready cleared with dvossel
>
>
> Diffs
> -----
>
> trunk/main/frame.c 336161
> trunk/main/features.c 336161
> trunk/main/datastore.c 336161
> trunk/main/event.c 336161
> trunk/main/config.c 336161
> trunk/apps/app_dial.c 336161
> trunk/apps/app_voicemail.c 336161
> trunk/channels/chan_sip.c 336161
> trunk/include/asterisk/astmm.h 336161
> trunk/include/asterisk/utils.h 336161
> trunk/main/astmm.c 336161
> trunk/main/ccss.c 336161
> trunk/main/indications.c 336161
> trunk/main/taskprocessor.c 336161
> trunk/res/res_agi.c 336161
>
> Diff: https://reviewboard.asterisk.org/r/1441/diff
>
>
> Testing
> -------
>
> it compiles with and without MALLOC_DEBUG,
> it starts
> and it do what it should do, the pointer is set to NULL after ast_free
>
>
> Thanks,
>
> schmidts
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.digium.com/pipermail/asterisk-dev/attachments/20110919/fd9cb5ca/attachment.htm>
More information about the asterisk-dev
mailing list