diff options
author | jpeeler <jpeeler@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-03-11 03:25:04 +0000 |
---|---|---|
committer | jpeeler <jpeeler@f38db490-d61c-443f-a65b-d21fe96a405b> | 2009-03-11 03:25:04 +0000 |
commit | d16c3fd4ca7637d33efa163106630a4110f7a448 (patch) | |
tree | 0cd32982e8825620c5d5bf61f85e3830118f357f | |
parent | 8e1667bc2d6b310744333ee2e30fd331fd66c70d (diff) |
Fix malloc debug macros to work properly with h323.
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: http://svn.digium.com/svn/asterisk/branches/1.4@181133 f38db490-d61c-443f-a65b-d21fe96a405b
-rw-r--r-- | apps/app_meetme.c | 6 | ||||
-rw-r--r-- | channels/chan_iax2.c | 2 | ||||
-rw-r--r-- | channels/chan_sip.c | 2 | ||||
-rw-r--r-- | channels/h323/ast_h323.cxx | 8 | ||||
-rw-r--r-- | include/asterisk/astmm.h | 34 | ||||
-rw-r--r-- | include/asterisk/threadstorage.h | 2 | ||||
-rw-r--r-- | include/asterisk/utils.h | 20 | ||||
-rw-r--r-- | pbx/pbx_ael.c | 4 | ||||
-rw-r--r-- | pbx/pbx_config.c | 10 | ||||
-rw-r--r-- | res/res_features.c | 4 |
10 files changed, 58 insertions, 34 deletions
diff --git a/apps/app_meetme.c b/apps/app_meetme.c index 4d6a9ce50..67c851a2c 100644 --- a/apps/app_meetme.c +++ b/apps/app_meetme.c @@ -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); diff --git a/channels/chan_iax2.c b/channels/chan_iax2.c index cb840502f..5e92aad08 100644 --- a/channels/chan_iax2.c +++ b/channels/chan_iax2.c @@ -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); } diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 040cee28e..14ca33276 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -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); diff --git a/channels/h323/ast_h323.cxx b/channels/h323/ast_h323.cxx index ee1fda448..1547bedcd 100644 --- a/channels/h323/ast_h323.cxx +++ b/channels/h323/ast_h323.cxx @@ -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; } diff --git a/include/asterisk/astmm.h b/include/asterisk/astmm.h index 8e63c85c5..b5c4f51e2 100644 --- a/include/asterisk/astmm.h +++ b/include/asterisk/astmm.h @@ -20,6 +20,11 @@ * \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 */ diff --git a/include/asterisk/threadstorage.h b/include/asterisk/threadstorage.h index 7a08723b1..9a1529030 100644 --- a/include/asterisk/threadstorage.h +++ b/include/asterisk/threadstorage.h @@ -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) \ diff --git a/include/asterisk/utils.h b/include/asterisk/utils.h index 44da65e70..f4790deca 100644 --- a/include/asterisk/utils.h +++ b/include/asterisk/utils.h @@ -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__) diff --git a/pbx/pbx_ael.c b/pbx/pbx_ael.c index 7eb3dc06c..655d09632 100644 --- a/pbx/pbx_ael.c +++ b/pbx/pbx_ael.c @@ -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); } diff --git a/pbx/pbx_config.c b/pbx/pbx_config.c index ad3c86abe..c99c2983b 100644 --- a/pbx/pbx_config.c +++ b/pbx/pbx_config.c @@ -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); } } } diff --git a/res/res_features.c b/res/res_features.c index cbdd57aaa..df4c7d300 100644 --- a/res/res_features.c +++ b/res/res_features.c @@ -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 { |