mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-29 23:39:35 +00:00
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
This commit is contained in:
@@ -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 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
|
* \param num_frames Number of addresses in the addresses list
|
||||||
* \retval NULL Unable to allocate memory
|
* \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
|
* \since 1.6.2.16
|
||||||
*/
|
*/
|
||||||
char **ast_bt_get_symbols(void **addresses, size_t num_frames);
|
char **ast_bt_get_symbols(void **addresses, size_t num_frames);
|
||||||
|
|||||||
@@ -123,7 +123,7 @@ void ao2_bt(void)
|
|||||||
for(i = 0; i < c; i++) {
|
for(i = 0; i < c; i++) {
|
||||||
ast_verbose("%d: %p %s\n", i, addresses[i], strings[i]);
|
ast_verbose("%d: %p %s\n", i, addresses[i], strings[i]);
|
||||||
}
|
}
|
||||||
free(strings);
|
ast_free(strings);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -1733,7 +1733,31 @@ char **ast_bt_get_symbols(void **addresses, size_t num_frames)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else /* !defined(BETTER_BACKTRACES) */
|
#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) */
|
#endif /* defined(BETTER_BACKTRACES) */
|
||||||
return strings;
|
return strings;
|
||||||
}
|
}
|
||||||
@@ -1758,9 +1782,7 @@ void ast_backtrace(void)
|
|||||||
ast_debug(1, "#%d: [%p] %s\n", i - 3, bt->addresses[i], strings[i]);
|
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. */
|
ast_free(strings);
|
||||||
#undef free
|
|
||||||
free(strings);
|
|
||||||
} else {
|
} else {
|
||||||
ast_debug(1, "Could not allocate memory for backtrace\n");
|
ast_debug(1, "Could not allocate memory for backtrace\n");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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]);
|
ast_str_append(str, 0, "\t%s\n", symbols[frame_iterator]);
|
||||||
}
|
}
|
||||||
|
|
||||||
free(symbols);
|
ast_free(symbols);
|
||||||
} else {
|
} else {
|
||||||
ast_str_append(str, 0, "\tCouldn't retrieve backtrace symbols\n");
|
ast_str_append(str, 0, "\tCouldn't retrieve backtrace symbols\n");
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user