MALLOC_DEBUG: Fix some misuses of free() when MALLOC_DEBUG is enabled.
authorRichard Mudgett <rmudgett@digium.com>
Wed, 2 Oct 2013 17:12:49 +0000 (17:12 +0000)
committerRichard Mudgett <rmudgett@digium.com>
Wed, 2 Oct 2013 17:12:49 +0000 (17:12 +0000)
* 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
main/json.c
main/stasis_cache.c
main/utils.c
res/res_ari.c
res/stasis_recording/stored.c

index fb665be..2199b33 100644 (file)
@@ -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),
index 5e50c42..e3ef3d0 100644 (file)
@@ -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;
index 279210d..86d4f4d 100644 (file)
@@ -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;
        }
index e2c5e2c..6eebff7 100644 (file)
@@ -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) {
index 5475efc..f4eca2e 100644 (file)
@@ -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 = {};
index f7ecaa1..255976d 100644 (file)
@@ -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;
 }