Author: wdoekes Date: Thu Aug 8 15:21:52 2013 New Revision: 396441 URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=396441 Log: Consistent memory allocation by ast_bt_get_symbols.
Always use ast_alloc/ast_free. This is handled differently in trunk (r391012). Review: https://reviewboard.asterisk.org/r/2580/ ........ Merged revisions 396427 from http://svn.asterisk.org/svn/asterisk/branches/1.8 Modified: branches/11/ (props changed) branches/11/include/asterisk/logger.h branches/11/main/astobj2.c branches/11/main/logger.c branches/11/main/utils.c Propchange: branches/11/ ------------------------------------------------------------------------------ Binary property 'branch-1.8-merged' - no diff available. Modified: branches/11/include/asterisk/logger.h URL: http://svnview.digium.com/svn/asterisk/branches/11/include/asterisk/logger.h?view=diff&rev=396441&r1=396440&r2=396441 ============================================================================== --- branches/11/include/asterisk/logger.h (original) +++ branches/11/include/asterisk/logger.h Thu Aug 8 15:21:52 2013 @@ -411,7 +411,7 @@ * \param addresses A list of addresses, such as the ->addresses structure element of struct ast_bt. * \param num_frames Number of addresses in the addresses list * \retval NULL Unable to allocate memory - * \return List of strings + * \return List of strings. Free the entire list with a single ast_free call. * \since 1.6.2.16 */ char **ast_bt_get_symbols(void **addresses, size_t num_frames); Modified: branches/11/main/astobj2.c URL: http://svnview.digium.com/svn/asterisk/branches/11/main/astobj2.c?view=diff&rev=396441&r1=396440&r2=396441 ============================================================================== --- branches/11/main/astobj2.c (original) +++ branches/11/main/astobj2.c Thu Aug 8 15:21:52 2013 @@ -123,7 +123,7 @@ for(i = 0; i < c; i++) { ast_verbose("%d: %p %s\n", i, addresses[i], strings[i]); } - free(strings); + ast_free(strings); } #endif Modified: branches/11/main/logger.c URL: http://svnview.digium.com/svn/asterisk/branches/11/main/logger.c?view=diff&rev=396441&r1=396440&r2=396441 ============================================================================== --- branches/11/main/logger.c (original) +++ branches/11/main/logger.c Thu Aug 8 15:21:52 2013 @@ -1733,7 +1733,31 @@ } } #else /* !defined(BETTER_BACKTRACES) */ - strings = backtrace_symbols(addresses, num_frames); + if ((strings = backtrace_symbols(addresses, num_frames))) { + /* Re-do value into ast_alloc'ed memory */ + char **ast_strings; + char *p; + unsigned size = num_frames + sizeof(*strings); + int i; + for (i = 0; i < num_frames; ++i) { + size += strlen(strings[i]) + 1; + } +#undef free + if (!(ast_strings = ast_malloc(size))) { + free(strings); + ast_log(LOG_WARNING, "Unable to re-allocate space for backtrace structure\n"); + return NULL; + } + p = (char *) (ast_strings + num_frames); + for (i = 0; i < num_frames; ++i) { + unsigned len = strlen(strings[i]) + 1; + ast_strings[i] = p; + memcpy(p, strings[i], len); + p += len; + } + free(strings); + strings = ast_strings; + } #endif /* defined(BETTER_BACKTRACES) */ return strings; } @@ -1758,9 +1782,7 @@ ast_debug(1, "#%d: [%p] %s\n", i - 3, bt->addresses[i], strings[i]); } - /* MALLOC_DEBUG will erroneously report an error here, unless we undef the macro. */ -#undef free - free(strings); + ast_free(strings); } else { ast_debug(1, "Could not allocate memory for backtrace\n"); } Modified: branches/11/main/utils.c URL: http://svnview.digium.com/svn/asterisk/branches/11/main/utils.c?view=diff&rev=396441&r1=396440&r2=396441 ============================================================================== --- branches/11/main/utils.c (original) +++ branches/11/main/utils.c Thu Aug 8 15:21:52 2013 @@ -869,7 +869,7 @@ ast_str_append(str, 0, "\t%s\n", symbols[frame_iterator]); } - free(symbols); + ast_free(symbols); } else { ast_str_append(str, 0, "\tCouldn't retrieve backtrace symbols\n"); } -- _____________________________________________________________________ -- Bandwidth and Colocation Provided by http://www.api-digital.com -- svn-commits mailing list To UNSUBSCRIBE or update options visit: http://lists.digium.com/mailman/listinfo/svn-commits
