]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Fix malloc debug macros to work properly with h323.
authorJeff Peeler <jpeeler@digium.com>
Wed, 11 Mar 2009 03:25:04 +0000 (03:25 +0000)
committerJeff Peeler <jpeeler@digium.com>
Wed, 11 Mar 2009 03:25:04 +0000 (03:25 +0000)
The main problem here was that cstdlib was undefining free thereby causing the
proper debug macros to not be used. ast_h323.cxx has been changed to call
ast_free instead to avoid the issue. Because using the ast prefix calls are
a better choice, ast_free_ptr is the new wrapper for free to pass to functions.
Also, a little bit of clean up was done to avoid the debug macros intentionally
being redefined.

(closes issue #13593)
Reported by: pj

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/1.4@181133 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_meetme.c
channels/chan_iax2.c
channels/chan_sip.c
channels/h323/ast_h323.cxx
include/asterisk/astmm.h
include/asterisk/threadstorage.h
include/asterisk/utils.h
pbx/pbx_ael.c
pbx/pbx_config.c
res/res_features.c

index 4d6a9ce50fddd373bd3f8f916703f0cb38f13b44..67c851a2c9c0479f9e3024fbf5839bc5c9ac5fbb 100644 (file)
@@ -4729,7 +4729,7 @@ static int sla_build_trunk(struct ast_config *cfg, const char *cat)
                        return -1;
                }
                if (ast_add_extension2(context, 0 /* don't replace */, "s", 1,
-                       NULL, NULL, slatrunk_app, ast_strdup(trunk->name), ast_free, sla_registrar)) {
+                       NULL, NULL, slatrunk_app, ast_strdup(trunk->name), ast_free_ptr, sla_registrar)) {
                        ast_log(LOG_ERROR, "Failed to automatically create extension "
                                "for trunk '%s'!\n", trunk->name);
                        destroy_trunk(trunk);
@@ -4868,7 +4868,7 @@ static int sla_build_station(struct ast_config *cfg, const char *cat)
                /* The extension for when the handset goes off-hook.
                 * exten => station1,1,SLAStation(station1) */
                if (ast_add_extension2(context, 0 /* don't replace */, station->name, 1,
-                       NULL, NULL, slastation_app, ast_strdup(station->name), ast_free, sla_registrar)) {
+                       NULL, NULL, slastation_app, ast_strdup(station->name), ast_free_ptr, sla_registrar)) {
                        ast_log(LOG_ERROR, "Failed to automatically create extension "
                                "for trunk '%s'!\n", station->name);
                        destroy_station(station);
@@ -4883,7 +4883,7 @@ static int sla_build_station(struct ast_config *cfg, const char *cat)
                        /* Extension for this line button 
                         * exten => station1_line1,1,SLAStation(station1_line1) */
                        if (ast_add_extension2(context, 0 /* don't replace */, exten, 1,
-                               NULL, NULL, slastation_app, ast_strdup(exten), ast_free, sla_registrar)) {
+                               NULL, NULL, slastation_app, ast_strdup(exten), ast_free_ptr, sla_registrar)) {
                                ast_log(LOG_ERROR, "Failed to automatically create extension "
                                        "for trunk '%s'!\n", station->name);
                                destroy_station(station);
index cb840502f60fb28085e1021307a2b56adefc55d6..5e92aad08820c5feae74dfe656e54af39aca4d4a 100644 (file)
@@ -6202,7 +6202,7 @@ static void register_peer_exten(struct iax2_peer *peer, int onoff)
                        if (onoff) {
                                if (!ast_exists_extension(NULL, regcontext, ext, 1, NULL))
                                        ast_add_extension(regcontext, 1, ext, 1, NULL, NULL,
-                                                         "Noop", ast_strdup(peer->name), ast_free, "IAX2");
+                                                         "Noop", ast_strdup(peer->name), ast_free_ptr, "IAX2");
                        } else
                                ast_context_remove_extension(regcontext, ext, 1, NULL);
                }
index 040cee28e144e3130c22223246ebdd94260b9e38..14ca33276b9d43c629be3d5620d1345fb710a0ae 100644 (file)
@@ -2488,7 +2488,7 @@ static void register_peer_exten(struct sip_peer *peer, int onoff)
                if (onoff) {
                        if (!ast_exists_extension(NULL, context, ext, 1, NULL)) {
                                ast_add_extension(context, 1, ext, 1, NULL, NULL, "Noop",
-                                        ast_strdup(peer->name), ast_free, "SIP");
+                                        ast_strdup(peer->name), ast_free_ptr, "SIP");
                        }
                } else {
                        ast_context_remove_extension(context, ext, 1, NULL);
index ee1fda44819b899c8dd825d0fcecd9f7dfb7de18..1547bedcdfa0372ae75c6e6bc8d833e79d5dec81 100644 (file)
@@ -28,6 +28,8 @@
  *
  * Version Info: $Id$
  */
+#include "asterisk.h"
+
 #include <arpa/inet.h>
 
 #include <list>
@@ -152,7 +154,7 @@ int PAsteriskLog::Buffer::sync()
                ast_verbose("%s", s);
                *s1 = c;
        }
-       free(str);
+       ast_free(str);
 
        string = PString();
        char *base = string.GetPointer(2000);
@@ -2015,7 +2017,7 @@ MyH323_ExternalRTPChannel::MyH323_ExternalRTPChannel(MyH323Connection & connecti
                /* tell the H.323 stack */
                SetExternalAddress(H323TransportAddress(localIpAddr, localPort), H323TransportAddress(localIpAddr, localPort + 1));
                /* clean up allocated memory */
-               free(info);
+               ast_free(info);
        }
 
        /* Get the payload code */
@@ -2234,7 +2236,7 @@ int h323_set_alias(struct oh323_alias *alias)
                        endPoint->SetGateway();
                }
                if (prefix)
-                       free(prefix);
+                       ast_free(prefix);
        }
        return 0;
 }
index 8e63c85c503018a0157633987a7f5c2299d2dabb..b5c4f51e292d71b4a82069f9005af1ad79fdaf3a 100644 (file)
  * \brief Asterisk memory usage debugging
  */
 
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 #ifndef _ASTERISK_ASTMM_H
 #define _ASTERISK_ASTMM_H
 
@@ -42,6 +47,7 @@
 #undef strndup
 #undef asprintf
 #undef vasprintf
+#undef free
 
 void *__ast_calloc(size_t nmemb, size_t size, const char *file, int lineno, const char *func);
 void *__ast_calloc_cache(size_t nmemb, size_t size, const char *file, int lineno, const char *func);
@@ -60,30 +66,58 @@ void __ast_mm_init(void);
 #define calloc(a,b) \
        __ast_calloc(a,b,__FILE__, __LINE__, __PRETTY_FUNCTION__)
 
+#define ast_calloc(a,b) \
+       __ast_calloc(a,b,__FILE__, __LINE__, __PRETTY_FUNCTION__)
+
 #define ast_calloc_cache(a,b) \
        __ast_calloc_cache(a,b,__FILE__, __LINE__, __PRETTY_FUNCTION__)
 
 #define malloc(a) \
        __ast_malloc(a,__FILE__, __LINE__, __PRETTY_FUNCTION__)
 
+#define ast_malloc(a) \
+       __ast_malloc(a,__FILE__, __LINE__, __PRETTY_FUNCTION__)
+
 #define free(a) \
        __ast_free(a,__FILE__, __LINE__, __PRETTY_FUNCTION__)
 
+#define ast_free(a) \
+       __ast_free(a,__FILE__, __LINE__, __PRETTY_FUNCTION__)
+
 #define realloc(a,b) \
        __ast_realloc(a,b,__FILE__, __LINE__, __PRETTY_FUNCTION__)
 
+#define ast_realloc(a,b) \
+       __ast_realloc(a,b,__FILE__, __LINE__, __PRETTY_FUNCTION__)
+
 #define strdup(a) \
        __ast_strdup(a,__FILE__, __LINE__, __PRETTY_FUNCTION__)
 
+#define ast_strdup(a) \
+       __ast_strdup(a,__FILE__, __LINE__, __PRETTY_FUNCTION__)
+
 #define strndup(a,b) \
        __ast_strndup(a,b,__FILE__, __LINE__, __PRETTY_FUNCTION__)
 
+#define ast_strndup(a,b) \
+       __ast_strndup(a,b,__FILE__, __LINE__, __PRETTY_FUNCTION__)
+
 #define asprintf(a, b, c...) \
        __ast_asprintf(__FILE__, __LINE__, __PRETTY_FUNCTION__, a, b, c)
 
+#define ast_asprintf(a, b, c...) \
+       __ast_asprintf(__FILE__, __LINE__, __PRETTY_FUNCTION__, a, b, c)
+
 #define vasprintf(a,b,c) \
        __ast_vasprintf(a,b,c,__FILE__, __LINE__, __PRETTY_FUNCTION__)
 
+#define ast_vasprintf(a,b,c) \
+       __ast_vasprintf(a,b,c,__FILE__, __LINE__, __PRETTY_FUNCTION__)
+
+#ifdef __cplusplus
+}
+#endif
+
 #else
 #error "NEVER INCLUDE astmm.h DIRECTLY!!"
 #endif /* _ASTERISK_ASTMM_H */
index 7a08723b16e1575e6a7c4f8cdbed20ef426651d7..9a1529030b19af415746a29205a0ffe0ed6bdba6 100644 (file)
@@ -65,7 +65,7 @@ void __ast_threadstorage_object_replace(void *key_old, void *key_new, size_t len
  * \endcode
  */
 #define AST_THREADSTORAGE(name, name_init) \
-       AST_THREADSTORAGE_CUSTOM(name, name_init, ast_free) 
+       AST_THREADSTORAGE_CUSTOM(name, name_init, ast_free_ptr
 
 #if !defined(DEBUG_THREADLOCALS)
 #define AST_THREADSTORAGE_CUSTOM(name, name_init, cleanup)  \
index 44da65e7030d016ca0719134484323f90149c0c0..f4790decac6eefaf81902440d63cf54620c6b5c9 100644 (file)
@@ -304,17 +304,18 @@ long int ast_random(void);
 /*! 
  * \brief free() wrapper
  *
- * ast_free should be used when a function pointer for free() needs to be passed
+ * ast_free_ptr should be used when a function pointer for free() needs to be passed
  * as the argument to a function. Otherwise, astmm will cause seg faults.
  */
 #ifdef __AST_DEBUG_MALLOC
-static void ast_free(void *ptr) attribute_unused;
-static void ast_free(void *ptr)
+static void ast_free_ptr(void *ptr) attribute_unused;
+static void ast_free_ptr(void *ptr)
 {
        free(ptr);
 }
 #else
 #define ast_free free
+#define ast_free_ptr ast_free
 #endif
 
 #ifndef __AST_DEBUG_MALLOC
@@ -497,19 +498,6 @@ int __attribute__((format(printf, 5, 0))) _ast_vasprintf(char **ret, const char
 }
 )
 
-#else
-
-/* If astmm is in use, let it handle these.  Otherwise, it will report that
-   all allocations are coming from this header file */
-
-#define ast_malloc(a)          malloc(a)
-#define ast_calloc(a,b)                calloc(a,b)
-#define ast_realloc(a,b)       realloc(a,b)
-#define ast_strdup(a)          strdup(a)
-#define ast_strndup(a,b)       strndup(a,b)
-#define ast_asprintf(a,b,...)  asprintf(a,b,__VA_ARGS__)
-#define ast_vasprintf(a,b,c)   vasprintf(a,b,c)
-
 #endif /* AST_DEBUG_MALLOC */
 
 #if !defined(ast_strdupa) && defined(__GNUC__)
index 7eb3dc06c62f8d9065550732902beac8500053b0..655d0963292b13058417e6820b0ed179d4997114 100644 (file)
@@ -4079,7 +4079,7 @@ void add_extensions(struct ael_extension *exten)
                pbx_substitute_variables_helper(NULL, exten->name, realext, sizeof(realext) - 1);
                if (exten->hints) {
                        if (ast_add_extension2(exten->context, 0 /*no replace*/, realext, PRIORITY_HINT, NULL, exten->cidmatch, 
-                                                                 exten->hints, NULL, ast_free, registrar)) {
+                                                                 exten->hints, NULL, ast_free_ptr, registrar)) {
                                ast_log(LOG_WARNING, "Unable to add step at priority 'hint' of extension '%s'\n",
                                                exten->name);
                        }
@@ -4159,7 +4159,7 @@ void add_extensions(struct ael_extension *exten)
                                label = 0;
                        
                        if (ast_add_extension2(exten->context, 0 /*no replace*/, realext, pr->priority_num, (label?label:NULL), exten->cidmatch, 
-                                                                 app, strdup(appargs), ast_free, registrar)) {
+                                                                 app, strdup(appargs), ast_free_ptr, registrar)) {
                                ast_log(LOG_WARNING, "Unable to add step at priority '%d' of extension '%s'\n", pr->priority_num, 
                                                exten->name);
                        }
index ad3c86abeff9494a5bf065c91bef582d2ff2eece..c99c2983b1bd2c772bf9821a13bbc7d5ae708da0 100644 (file)
@@ -1536,7 +1536,7 @@ static int handle_context_add_extension_deprecated(int fd, int argc, char *argv[
        if (!app_data)
                app_data="";
        if (ast_add_extension(argv[4], argc == 6 ? 1 : 0, exten, iprior, NULL, cidmatch, app,
-               (void *)strdup(app_data), ast_free, registrar)) {
+               (void *)strdup(app_data), ast_free_ptr, registrar)) {
                switch (errno) {
                case ENOMEM:
                        ast_cli(fd, "Out of free memory\n");
@@ -1629,7 +1629,7 @@ static int handle_context_add_extension(int fd, int argc, char *argv[])
        if (!app_data)
                app_data="";
        if (ast_add_extension(argv[5], argc == 7 ? 1 : 0, exten, iprior, NULL, cidmatch, app,
-               (void *)strdup(app_data), ast_free, registrar)) {
+               (void *)strdup(app_data), ast_free_ptr, registrar)) {
                switch (errno) {
                case ENOMEM:
                        ast_cli(fd, "Out of free memory\n");
@@ -2372,7 +2372,7 @@ static int pbx_load_config(const char *config_file)
                                                lastpri = ipri;
                                                if (!ast_opt_dont_warn && !strcmp(realext, "_."))
                                                        ast_log(LOG_WARNING, "The use of '_.' for an extension is strongly discouraged and can have unexpected behavior.  Please use '_X.' instead at line %d\n", v->lineno);
-                                               if (ast_add_extension2(con, 0, realext, ipri, label, cidmatch, appl, strdup(data), ast_free, registrar)) {
+                                               if (ast_add_extension2(con, 0, realext, ipri, label, cidmatch, appl, strdup(data), ast_free_ptr, registrar)) {
                                                        ast_log(LOG_WARNING, "Unable to register extension at line %d\n", v->lineno);
                                                }
                                        }
@@ -2516,9 +2516,9 @@ static void pbx_load_users(void)
                        /* If voicemail, use "stdexten" else use plain old dial */
                        if (hasvoicemail) {
                                snprintf(tmp, sizeof(tmp), "stdexten|%s|${HINT}", cat);
-                               ast_add_extension2(con, 0, cat, 1, NULL, NULL, "Macro", strdup(tmp), ast_free, registrar);
+                               ast_add_extension2(con, 0, cat, 1, NULL, NULL, "Macro", strdup(tmp), ast_free_ptr, registrar);
                        } else {
-                               ast_add_extension2(con, 0, cat, 1, NULL, NULL, "Dial", strdup("${HINT}"), ast_free, registrar);
+                               ast_add_extension2(con, 0, cat, 1, NULL, NULL, "Dial", strdup("${HINT}"), ast_free_ptr, registrar);
                        }
                }
        }
index cbdd57aaab2d7bb6e85c9ae6519aaf70d752128b..df4c7d300784ef18edd9dd54b589d99575718d4c 100644 (file)
@@ -518,7 +518,7 @@ static int park_call_full(struct ast_channel *chan, struct ast_channel *peer, in
        if (!con)       /* Still no context? Bad */
                ast_log(LOG_ERROR, "Parking context '%s' does not exist and unable to create\n", parking_con);
        if (con) {
-               if (!ast_add_extension2(con, 1, pu->parkingexten, 1, NULL, NULL, parkedcall, strdup(pu->parkingexten), ast_free, registrar)) {
+               if (!ast_add_extension2(con, 1, pu->parkingexten, 1, NULL, NULL, parkedcall, strdup(pu->parkingexten), ast_free_ptr, registrar)) {
                        notify_metermaids(pu->parkingexten, parking_con);
                }
        }
@@ -2195,7 +2195,7 @@ static void *do_parking_thread(void *ignore)
                                                        snprintf(returnexten, sizeof(returnexten), "%s|30|t", peername);
                                                }
 
-                                               ast_add_extension2(con, 1, peername, 1, NULL, NULL, "Dial", strdup(returnexten), ast_free, registrar);
+                                               ast_add_extension2(con, 1, peername, 1, NULL, NULL, "Dial", strdup(returnexten), ast_free_ptr, registrar);
                                        }
                                        set_c_e_p(chan, parking_con_dial, peername, 1);
                                } else {