diff --git a/codecs/lpc10/lpcini.c b/codecs/lpc10/lpcini.c index 8efb640680..ea68176e3d 100644 --- a/codecs/lpc10/lpcini.c +++ b/codecs/lpc10/lpcini.c @@ -34,7 +34,7 @@ Some OSS fixes and a few lpc changes to make it actually work -lf2c -lm (in that order) */ -#define WRAP_LIBC_MALLOC +#define ASTMM_LIBC ASTMM_REDIRECT #include "asterisk.h" #include "f2c.h" diff --git a/contrib/scripts/get_mp3_source.sh b/contrib/scripts/get_mp3_source.sh index 860e2bc02f..6d984659da 100755 --- a/contrib/scripts/get_mp3_source.sh +++ b/contrib/scripts/get_mp3_source.sh @@ -7,8 +7,8 @@ if [ -f addons/mp3/mpg123.h ]; then echo "***" # Manually patch interface.c if not done yet. - if ! grep -q WRAP_LIBC_MALLOC addons/mp3/interface.c; then - sed -i -e '/#include "asterisk.h"/i#define WRAP_LIBC_MALLOC' \ + if ! grep -q ASTMM_LIBC addons/mp3/interface.c; then + sed -i -e '/#include "asterisk.h"/i#define ASTMM_LIBC ASTMM_REDIRECT' \ addons/mp3/interface.c fi @@ -18,8 +18,8 @@ fi svn export http://svn.digium.com/svn/thirdparty/mp3/trunk addons/mp3 $@ # Manually patch interface.c if not done yet. -if ! grep -q WRAP_LIBC_MALLOC addons/mp3/interface.c; then - sed -i -e '/#include "asterisk.h"/i#define WRAP_LIBC_MALLOC' \ +if ! grep -q ASTMM_LIBC addons/mp3/interface.c; then + sed -i -e '/#include "asterisk.h"/i#define ASTMM_LIBC ASTMM_REDIRECT' \ addons/mp3/interface.c fi diff --git a/include/asterisk/astmm.h b/include/asterisk/astmm.h index 1d778d4c53..6c9a8aeeeb 100644 --- a/include/asterisk/astmm.h +++ b/include/asterisk/astmm.h @@ -44,16 +44,6 @@ extern "C" { #include #include -/* Undefine any macros */ -#undef malloc -#undef calloc -#undef realloc -#undef strdup -#undef strndup -#undef asprintf -#undef vasprintf -#undef free - void *ast_std_malloc(size_t size); void *ast_std_calloc(size_t nmemb, size_t size); void *ast_std_realloc(void *ptr, size_t size); @@ -74,9 +64,72 @@ int __ast_vasprintf(char **strp, const char *format, va_list ap, const char *fil void __ast_mm_init_phase_1(void); void __ast_mm_init_phase_2(void); -/* Redefine libc malloc to our own versions */ +/*! + * \brief ASTMM_LIBC can be defined to control the meaning of standard allocators. + * + * \note The standard allocators effected by this compiler define are: + * malloc, calloc, realloc, strdup, strndup, asprintf, vasprintf and free. + * + * @{ + */ + +/*! + * \brief Produce compiler errors if standard allocators are used. + * + * \note This is the default option, and in most cases the correct option. + * Any use of standard allocators will cause an error, even if those uses + * are in unused static inline header functions. + */ +#define ASTMM_BLOCK 0 + +/*! + * \brief Redirect standard allocators to use Asterisk functions. + * + * \note This option is used in some cases instead of changing the + * existing source to use Asterisk functions. New code should + * generally avoid this option, except where it's needed to work + * with situations where switching the code is unreasonable, such + * as output from code generators that are hard coded to use + * standard functions. + */ +#define ASTMM_REDIRECT 1 + +/*! + * \brief Standard allocators are used directly. + * + * \note This option is needed when including 3rd party headers with calls + * to standard allocators from inline functions. Using ASTMM_REDIRECT in + * this situation could result in an object being allocated by malloc and + * freed by ast_free, or the reverse. + */ +#define ASTMM_IGNORE 2 + +/*! + * }@ + */ + +#if !defined(ASTMM_LIBC) +/* BLOCK libc allocators by default. */ +#define ASTMM_LIBC ASTMM_BLOCK +#endif -#ifdef WRAP_LIBC_MALLOC +#if ASTMM_LIBC == ASTMM_IGNORE +/* Don't touch the libc functions. */ +#else + +/* Undefine any macros */ +#undef malloc +#undef calloc +#undef realloc +#undef strdup +#undef strndup +#undef asprintf +#undef vasprintf +#undef free + +#if ASTMM_LIBC == ASTMM_REDIRECT + +/* Redefine libc functions to our own versions */ #define calloc(a,b) \ __ast_calloc(a,b,__FILE__, __LINE__, __PRETTY_FUNCTION__) #define malloc(a) \ @@ -93,7 +146,10 @@ void __ast_mm_init_phase_2(void); __ast_asprintf(__FILE__, __LINE__, __PRETTY_FUNCTION__, a, b, c) #define vasprintf(a,b,c) \ __ast_vasprintf(a,b,c,__FILE__, __LINE__, __PRETTY_FUNCTION__) -#else + +#elif ASTMM_LIBC == ASTMM_BLOCK + +/* Redefine libc functions to cause compile errors */ #define calloc(a,b) \ Do_not_use_calloc__use_ast_calloc->fail(a,b) #define malloc(a) \ @@ -110,6 +166,11 @@ void __ast_mm_init_phase_2(void); Do_not_use_asprintf__use_ast_asprintf->fail(a,b,c) #define vasprintf(a,b,c) \ Do_not_use_vasprintf__use_ast_vasprintf->fail(a,b,c) + +#else +#error "Unacceptable value for the macro ASTMM_LIBC" +#endif + #endif /* Provide our own definitions */ diff --git a/main/ast_expr2.c b/main/ast_expr2.c index 84a3d7b977..d41072d6e4 100644 --- a/main/ast_expr2.c +++ b/main/ast_expr2.c @@ -91,7 +91,7 @@ * $FreeBSD: src/bin/expr/expr.y,v 1.16 2000/07/22 10:59:36 se Exp $ */ -#define WRAP_LIBC_MALLOC +#define ASTMM_LIBC ASTMM_REDIRECT #include "asterisk.h" #include diff --git a/main/ast_expr2.y b/main/ast_expr2.y index 8a151679d2..762e83d840 100644 --- a/main/ast_expr2.y +++ b/main/ast_expr2.y @@ -12,7 +12,7 @@ * $FreeBSD: src/bin/expr/expr.y,v 1.16 2000/07/22 10:59:36 se Exp $ */ -#define WRAP_LIBC_MALLOC +#define ASTMM_LIBC ASTMM_REDIRECT #include "asterisk.h" #include diff --git a/main/ast_expr2f.c b/main/ast_expr2f.c index c2d4e00a4b..c6a1b97353 100644 --- a/main/ast_expr2f.c +++ b/main/ast_expr2f.c @@ -1,4 +1,4 @@ -#define WRAP_LIBC_MALLOC +#define ASTMM_LIBC ASTMM_REDIRECT #include "asterisk.h" #line 2 "ast_expr2f.c" diff --git a/main/astmm.c b/main/astmm.c index a4d5602ce6..8260460ab3 100644 --- a/main/astmm.c +++ b/main/astmm.c @@ -28,6 +28,7 @@ core ***/ +#define ASTMM_LIBC ASTMM_IGNORE #include "asterisk.h" #if defined(__AST_DEBUG_MALLOC) @@ -61,16 +62,6 @@ enum func_type { FUNC_ASPRINTF }; -/* Undefine all our macros */ -#undef malloc -#undef calloc -#undef realloc -#undef strdup -#undef strndup -#undef free -#undef vasprintf -#undef asprintf - #define FENCE_MAGIC 0xfeedbabe /*!< Allocated memory high/low fence overwrite check. */ #define FREED_MAGIC 0xdeaddead /*!< Freed memory wipe filler. */ #define MALLOC_FILLER 0x55 /*!< Malloced memory filler. Must not be zero. */ diff --git a/main/hashtab.c b/main/hashtab.c index 27a700a9da..c08880c69c 100644 --- a/main/hashtab.c +++ b/main/hashtab.c @@ -26,7 +26,7 @@ core ***/ -#define WRAP_LIBC_MALLOC +#define ASTMM_LIBC ASTMM_REDIRECT #include "asterisk.h" ASTERISK_REGISTER_FILE() diff --git a/res/ael/ael.flex b/res/ael/ael.flex index a412eaf349..b1b2bd76dc 100644 --- a/res/ael/ael.flex +++ b/res/ael/ael.flex @@ -68,7 +68,7 @@ %option bison-locations %{ -#define WRAP_LIBC_MALLOC +#define ASTMM_LIBC ASTMM_REDIRECT #include "asterisk.h" ASTERISK_REGISTER_FILE() diff --git a/res/ael/ael.tab.c b/res/ael/ael.tab.c index f146ffb096..9f1f19bb62 100644 --- a/res/ael/ael.tab.c +++ b/res/ael/ael.tab.c @@ -99,7 +99,7 @@ * */ -#define WRAP_LIBC_MALLOC +#define ASTMM_LIBC ASTMM_REDIRECT #include "asterisk.h" ASTERISK_REGISTER_FILE() diff --git a/res/ael/ael.y b/res/ael/ael.y index 5ab9c969f0..e5c1655c55 100644 --- a/res/ael/ael.y +++ b/res/ael/ael.y @@ -22,7 +22,7 @@ * */ -#define WRAP_LIBC_MALLOC +#define ASTMM_LIBC ASTMM_REDIRECT #include "asterisk.h" ASTERISK_REGISTER_FILE() diff --git a/res/ael/ael_lex.c b/res/ael/ael_lex.c index c5eba92b76..a7a20aa60f 100644 --- a/res/ael/ael_lex.c +++ b/res/ael/ael_lex.c @@ -1,4 +1,4 @@ -#define WRAP_LIBC_MALLOC +#define ASTMM_LIBC ASTMM_REDIRECT #include "asterisk.h" #line 2 "ael_lex.c" diff --git a/res/ael/pval.c b/res/ael/pval.c index d29bbcfbd9..d5ea5accf0 100644 --- a/res/ael/pval.c +++ b/res/ael/pval.c @@ -27,7 +27,7 @@ extended ***/ -#define WRAP_LIBC_MALLOC +#define ASTMM_LIBC ASTMM_REDIRECT #include "asterisk.h" ASTERISK_REGISTER_FILE() diff --git a/res/res_fax_spandsp.c b/res/res_fax_spandsp.c index 42492273d8..ddbb178407 100644 --- a/res/res_fax_spandsp.c +++ b/res/res_fax_spandsp.c @@ -48,12 +48,8 @@ extended ***/ -/* Include spandsp headers before asterisk.h so the inline functions can continue using - * malloc and free, even with MALLOC_DEBUG enabled. */ -#define SPANDSP_EXPOSE_INTERNAL_STRUCTURES -#include -#include - +/* Needed for spandsp headers */ +#define ASTMM_LIBC ASTMM_IGNORE #include "asterisk.h" ASTERISK_REGISTER_FILE() @@ -69,6 +65,10 @@ ASTERISK_REGISTER_FILE() #include "asterisk/channel.h" #include "asterisk/format_cache.h" +#define SPANDSP_EXPOSE_INTERNAL_STRUCTURES +#include +#include + #define SPANDSP_FAX_SAMPLES 160 #define SPANDSP_FAX_TIMER_RATE 8000 / SPANDSP_FAX_SAMPLES /* 50 ticks per second, 20ms, 160 samples per second */ #define SPANDSP_ENGAGE_UDPTL_NAT_RETRY 3 diff --git a/res/snmp/agent.c b/res/snmp/agent.c index bebcee11ec..f0e089fb6f 100644 --- a/res/snmp/agent.c +++ b/res/snmp/agent.c @@ -18,6 +18,8 @@ extended ***/ +/* Needed for net-snmp headers */ +#define ASTMM_LIBC ASTMM_IGNORE #include "asterisk.h" ASTERISK_REGISTER_FILE() diff --git a/utils/extconf.c b/utils/extconf.c index 8729801725..baca11bf58 100644 --- a/utils/extconf.c +++ b/utils/extconf.c @@ -43,7 +43,7 @@ extended ***/ -#define WRAP_LIBC_MALLOC +#define ASTMM_LIBC ASTMM_REDIRECT #include "asterisk.h" #undef DEBUG_THREADS