From: Jeff Peeler Date: Wed, 11 Mar 2009 03:25:04 +0000 (+0000) Subject: Fix malloc debug macros to work properly with h323. X-Git-Tag: 1.4.25-rc1~147 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=21ca773c2829d7448a8a5dfec5f81336714ee590;p=thirdparty%2Fasterisk.git 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: https://origsvn.digium.com/svn/asterisk/branches/1.4@181133 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- diff --git a/apps/app_meetme.c b/apps/app_meetme.c index 4d6a9ce50f..67c851a2c9 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 cb840502f6..5e92aad088 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 040cee28e1..14ca33276b 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 ee1fda4481..1547bedcdf 100644 --- a/channels/h323/ast_h323.cxx +++ b/channels/h323/ast_h323.cxx @@ -28,6 +28,8 @@ * * Version Info: $Id$ */ +#include "asterisk.h" + #include #include @@ -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 8e63c85c50..b5c4f51e29 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 7a08723b16..9a1529030b 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 44da65e703..f4790decac 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 7eb3dc06c6..655d096329 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 ad3c86abef..c99c2983b1 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 cbdd57aaab..df4c7d3007 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 {