mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-19 03:08:45 +00:00
MALLOC_DEBUG: Fix some misuses of free() when MALLOC_DEBUG is enabled.
* There were several places in ARI where an external library was mallocing memory that must always be released with free(). When MALLOC_DEBUG is enabled, free() is redirected to the MALLOC_DEBUG version. Since the external library call still uses the normal malloc(), MALLOC_DEBUG complains that the freed memory block is not registered and will not free it. These cases must use ast_std_free(). * Changed calls to asprintf() and vasprintf() to the equivalent ast_asprintf() and ast_vasprintf() versions respectively. ........ Merged revisions 400270 from http://svn.asterisk.org/svn/asterisk/branches/12 git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@400271 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -1215,8 +1215,7 @@ static int handle_gosub(struct ast_channel *chan, AGI *agi, int argc, const char
|
|||||||
ast_agi_send(agi->fd, chan, "200 result=%d Gosub failed\n", res);
|
ast_agi_send(agi->fd, chan, "200 result=%d Gosub failed\n", res);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Must use free because the memory was allocated by asprintf(). */
|
ast_free(gosub_args);
|
||||||
free(gosub_args);
|
|
||||||
|
|
||||||
ast_channel_lock(chan);
|
ast_channel_lock(chan);
|
||||||
ast_debug(4, "%s Ending location: %s,%s,%d\n", ast_channel_name(chan),
|
ast_debug(4, "%s Ending location: %s,%s,%d\n", ast_channel_name(chan),
|
||||||
|
@@ -340,10 +340,10 @@ struct ast_json *ast_json_vstringf(const char *format, va_list args)
|
|||||||
json_t *ret = NULL;
|
json_t *ret = NULL;
|
||||||
|
|
||||||
if (format) {
|
if (format) {
|
||||||
int err = vasprintf(&str, format, args);
|
int err = ast_vasprintf(&str, format, args);
|
||||||
if (err > 0) {
|
if (err > 0) {
|
||||||
ret = json_string(str);
|
ret = json_string(str);
|
||||||
free(str);
|
ast_free(str);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return (struct ast_json *)ret;
|
return (struct ast_json *)ret;
|
||||||
|
@@ -448,10 +448,10 @@ struct stasis_caching_topic *stasis_caching_topic_create(struct stasis_topic *or
|
|||||||
{
|
{
|
||||||
RAII_VAR(struct stasis_caching_topic *, caching_topic, NULL, ao2_cleanup);
|
RAII_VAR(struct stasis_caching_topic *, caching_topic, NULL, ao2_cleanup);
|
||||||
struct stasis_subscription *sub;
|
struct stasis_subscription *sub;
|
||||||
RAII_VAR(char *, new_name, NULL, free);
|
RAII_VAR(char *, new_name, NULL, ast_free);
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = asprintf(&new_name, "%s-cached", stasis_topic_name(original_topic));
|
ret = ast_asprintf(&new_name, "%s-cached", stasis_topic_name(original_topic));
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
13
main/utils.c
13
main/utils.c
@@ -656,9 +656,10 @@ static void lock_info_destroy(void *data)
|
|||||||
}
|
}
|
||||||
|
|
||||||
pthread_mutex_destroy(&lock_info->lock);
|
pthread_mutex_destroy(&lock_info->lock);
|
||||||
if (lock_info->thread_name)
|
if (lock_info->thread_name) {
|
||||||
free((void *) lock_info->thread_name);
|
ast_free((void *) lock_info->thread_name);
|
||||||
free(lock_info);
|
}
|
||||||
|
ast_free(lock_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
@@ -2184,7 +2185,7 @@ int ast_mkdir(const char *path, int mode)
|
|||||||
|
|
||||||
static int safe_mkdir(const char *base_path, char *path, int mode)
|
static int safe_mkdir(const char *base_path, char *path, int mode)
|
||||||
{
|
{
|
||||||
RAII_VAR(char *, absolute_path, NULL, free);
|
RAII_VAR(char *, absolute_path, NULL, ast_std_free);
|
||||||
|
|
||||||
absolute_path = realpath(path, NULL);
|
absolute_path = realpath(path, NULL);
|
||||||
|
|
||||||
@@ -2206,7 +2207,7 @@ static int safe_mkdir(const char *base_path, char *path, int mode)
|
|||||||
int res;
|
int res;
|
||||||
|
|
||||||
while (path_term) {
|
while (path_term) {
|
||||||
RAII_VAR(char *, absolute_subpath, NULL, free);
|
RAII_VAR(char *, absolute_subpath, NULL, ast_std_free);
|
||||||
|
|
||||||
/* Truncate the path one past the slash */
|
/* Truncate the path one past the slash */
|
||||||
char c = *(path_term + 1);
|
char c = *(path_term + 1);
|
||||||
@@ -2254,7 +2255,7 @@ static int safe_mkdir(const char *base_path, char *path, int mode)
|
|||||||
|
|
||||||
int ast_safe_mkdir(const char *base_path, const char *path, int mode)
|
int ast_safe_mkdir(const char *base_path, const char *path, int mode)
|
||||||
{
|
{
|
||||||
RAII_VAR(char *, absolute_base_path, NULL, free);
|
RAII_VAR(char *, absolute_base_path, NULL, ast_std_free);
|
||||||
RAII_VAR(char *, p, NULL, ast_free);
|
RAII_VAR(char *, p, NULL, ast_free);
|
||||||
|
|
||||||
if (base_path == NULL || path == NULL) {
|
if (base_path == NULL || path == NULL) {
|
||||||
|
@@ -554,8 +554,8 @@ void ast_ari_get_docs(const char *uri, struct ast_variable *headers,
|
|||||||
struct ast_ari_response *response)
|
struct ast_ari_response *response)
|
||||||
{
|
{
|
||||||
RAII_VAR(struct ast_str *, absolute_path_builder, NULL, ast_free);
|
RAII_VAR(struct ast_str *, absolute_path_builder, NULL, ast_free);
|
||||||
RAII_VAR(char *, absolute_api_dirname, NULL, free);
|
RAII_VAR(char *, absolute_api_dirname, NULL, ast_std_free);
|
||||||
RAII_VAR(char *, absolute_filename, NULL, free);
|
RAII_VAR(char *, absolute_filename, NULL, ast_std_free);
|
||||||
struct ast_json *obj = NULL;
|
struct ast_json *obj = NULL;
|
||||||
struct ast_variable *host = NULL;
|
struct ast_variable *host = NULL;
|
||||||
struct ast_json_error error = {};
|
struct ast_json_error error = {};
|
||||||
|
@@ -78,7 +78,7 @@ static int split_path(const char *path, char **dir, char **file)
|
|||||||
{
|
{
|
||||||
RAII_VAR(char *, relative_dir, NULL, ast_free);
|
RAII_VAR(char *, relative_dir, NULL, ast_free);
|
||||||
RAII_VAR(char *, absolute_dir, NULL, ast_free);
|
RAII_VAR(char *, absolute_dir, NULL, ast_free);
|
||||||
RAII_VAR(char *, real_dir, NULL, free);
|
RAII_VAR(char *, real_dir, NULL, ast_std_free);
|
||||||
char *last_slash;
|
char *last_slash;
|
||||||
const char *file_portion;
|
const char *file_portion;
|
||||||
|
|
||||||
@@ -108,7 +108,16 @@ static int split_path(const char *path, char **dir, char **file)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(__AST_DEBUG_MALLOC)
|
||||||
*dir = ast_strdup(real_dir); /* Dupe so we can ast_free() */
|
*dir = ast_strdup(real_dir); /* Dupe so we can ast_free() */
|
||||||
|
#else
|
||||||
|
/*
|
||||||
|
* ast_std_free() and ast_free() are the same thing at this time
|
||||||
|
* so we don't need to dupe.
|
||||||
|
*/
|
||||||
|
*dir = real_dir;
|
||||||
|
real_dir = NULL;
|
||||||
|
#endif /* defined(__AST_DEBUG_MALLOC) */
|
||||||
*file = ast_strdup(file_portion);
|
*file = ast_strdup(file_portion);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user