From 97fcd6366d128a8b9b176783743d66dbfab6e615 Mon Sep 17 00:00:00 2001 From: Richard Mudgett <rmudgett@digium.com> Date: Wed, 2 Oct 2013 17:12:49 +0000 Subject: [PATCH] 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 --- apps/app_stack.c | 3 +-- main/json.c | 4 ++-- main/stasis_cache.c | 4 ++-- main/utils.c | 13 +++++++------ res/res_ari.c | 4 ++-- res/stasis_recording/stored.c | 11 ++++++++++- 6 files changed, 24 insertions(+), 15 deletions(-) diff --git a/apps/app_stack.c b/apps/app_stack.c index fb665beb21..2199b33693 100644 --- a/apps/app_stack.c +++ b/apps/app_stack.c @@ -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); } - /* Must use free because the memory was allocated by asprintf(). */ - free(gosub_args); + ast_free(gosub_args); ast_channel_lock(chan); ast_debug(4, "%s Ending location: %s,%s,%d\n", ast_channel_name(chan), diff --git a/main/json.c b/main/json.c index 5e50c424ae..e3ef3d0014 100644 --- a/main/json.c +++ b/main/json.c @@ -340,10 +340,10 @@ struct ast_json *ast_json_vstringf(const char *format, va_list args) json_t *ret = NULL; if (format) { - int err = vasprintf(&str, format, args); + int err = ast_vasprintf(&str, format, args); if (err > 0) { ret = json_string(str); - free(str); + ast_free(str); } } return (struct ast_json *)ret; diff --git a/main/stasis_cache.c b/main/stasis_cache.c index 279210d5b6..86d4f4d219 100644 --- a/main/stasis_cache.c +++ b/main/stasis_cache.c @@ -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); struct stasis_subscription *sub; - RAII_VAR(char *, new_name, NULL, free); + RAII_VAR(char *, new_name, NULL, ast_free); 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) { return NULL; } diff --git a/main/utils.c b/main/utils.c index e2c5e2c3f6..6eebff71a8 100644 --- a/main/utils.c +++ b/main/utils.c @@ -656,9 +656,10 @@ static void lock_info_destroy(void *data) } pthread_mutex_destroy(&lock_info->lock); - if (lock_info->thread_name) - free((void *) lock_info->thread_name); - free(lock_info); + if (lock_info->thread_name) { + ast_free((void *) lock_info->thread_name); + } + 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) { - RAII_VAR(char *, absolute_path, NULL, free); + RAII_VAR(char *, absolute_path, NULL, ast_std_free); absolute_path = realpath(path, NULL); @@ -2206,7 +2207,7 @@ static int safe_mkdir(const char *base_path, char *path, int mode) int res; 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 */ 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) { - 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); if (base_path == NULL || path == NULL) { diff --git a/res/res_ari.c b/res/res_ari.c index 5475efce93..f4eca2e431 100644 --- a/res/res_ari.c +++ b/res/res_ari.c @@ -554,8 +554,8 @@ void ast_ari_get_docs(const char *uri, struct ast_variable *headers, struct ast_ari_response *response) { RAII_VAR(struct ast_str *, absolute_path_builder, NULL, ast_free); - RAII_VAR(char *, absolute_api_dirname, NULL, free); - RAII_VAR(char *, absolute_filename, NULL, free); + RAII_VAR(char *, absolute_api_dirname, NULL, ast_std_free); + RAII_VAR(char *, absolute_filename, NULL, ast_std_free); struct ast_json *obj = NULL; struct ast_variable *host = NULL; struct ast_json_error error = {}; diff --git a/res/stasis_recording/stored.c b/res/stasis_recording/stored.c index f7ecaa179e..255976d285 100644 --- a/res/stasis_recording/stored.c +++ b/res/stasis_recording/stored.c @@ -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 *, absolute_dir, NULL, ast_free); - RAII_VAR(char *, real_dir, NULL, free); + RAII_VAR(char *, real_dir, NULL, ast_std_free); char *last_slash; const char *file_portion; @@ -108,7 +108,16 @@ static int split_path(const char *path, char **dir, char **file) return -1; } +#if defined(__AST_DEBUG_MALLOC) *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); return 0; } -- GitLab