From: Walter Doekes Date: Thu, 8 Aug 2013 20:21:52 +0000 (+0000) Subject: Consistent memory allocation by ast_bt_get_symbols. X-Git-Tag: 11.6.0-rc1~3^2~67 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b3eef9957e81239f0961db33de3e5522719e34c1;p=thirdparty%2Fasterisk.git 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 git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/11@396441 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/include/asterisk/logger.h b/include/asterisk/logger.h index 1632291df4..fc70a815ac 100644 --- a/include/asterisk/logger.h +++ b/include/asterisk/logger.h @@ -411,7 +411,7 @@ void *ast_bt_destroy(struct ast_bt *bt); * \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); diff --git a/main/astobj2.c b/main/astobj2.c index 745f1c941f..1ab5d3e1c8 100644 --- a/main/astobj2.c +++ b/main/astobj2.c @@ -123,7 +123,7 @@ void ao2_bt(void) for(i = 0; i < c; i++) { ast_verbose("%d: %p %s\n", i, addresses[i], strings[i]); } - free(strings); + ast_free(strings); } #endif diff --git a/main/logger.c b/main/logger.c index c06ebd0d50..2011d250c9 100644 --- a/main/logger.c +++ b/main/logger.c @@ -1733,7 +1733,31 @@ char **ast_bt_get_symbols(void **addresses, size_t num_frames) } } #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 @@ void ast_backtrace(void) 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"); } diff --git a/main/utils.c b/main/utils.c index 2c3537a8fe..e77215b5a9 100644 --- a/main/utils.c +++ b/main/utils.c @@ -869,7 +869,7 @@ static void append_backtrace_information(struct ast_str **str, struct ast_bt *bt 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"); }