aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjpeeler <jpeeler@f38db490-d61c-443f-a65b-d21fe96a405b>2009-03-11 03:25:04 +0000
committerjpeeler <jpeeler@f38db490-d61c-443f-a65b-d21fe96a405b>2009-03-11 03:25:04 +0000
commitd16c3fd4ca7637d33efa163106630a4110f7a448 (patch)
tree0cd32982e8825620c5d5bf61f85e3830118f357f
parent8e1667bc2d6b310744333ee2e30fd331fd66c70d (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.c6
-rw-r--r--channels/chan_iax2.c2
-rw-r--r--channels/chan_sip.c2
-rw-r--r--channels/h323/ast_h323.cxx8
-rw-r--r--include/asterisk/astmm.h34
-rw-r--r--include/asterisk/threadstorage.h2
-rw-r--r--include/asterisk/utils.h20
-rw-r--r--pbx/pbx_ael.c4
-rw-r--r--pbx/pbx_config.c10
-rw-r--r--res/res_features.c4
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 {