diff --git a/codecs/lpc10/lpcini.c b/codecs/lpc10/lpcini.c
index 8efb640680d1b3397d541a2e9f7d6c937c00e926..ea68176e3d5d2c4db6c13fcbf8f357f11fac21fa 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 860e2bc02fe20be7da6dee760565e66819236342..6d984659dab275873d2fd3f06f1d4c4df10ce810 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 1d778d4c5388c5eaf8980492825b5510f453d10c..6c9a8aeeeb2d777d9acbc521f4d3bb8d09481924 100644
--- a/include/asterisk/astmm.h
+++ b/include/asterisk/astmm.h
@@ -44,16 +44,6 @@ extern "C" {
 #include <stdio.h>
 #include <stdarg.h>
 
-/* 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 84a3d7b977e0e6c8209184104234a7f09ec84b93..d41072d6e4b6867be14d2c1c0921d41ac0a24b95 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 <sys/types.h>
diff --git a/main/ast_expr2.y b/main/ast_expr2.y
index 8a151679d2cd67ce7f3853eb4ca8a515654f01cf..762e83d840f6b829ba9dac105506f0a821b0177f 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 <sys/types.h>
diff --git a/main/ast_expr2f.c b/main/ast_expr2f.c
index c2d4e00a4b15b3f062be8191b01ab131f6f199e7..c6a1b97353bd86710b0168acfd29454465fabee1 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 a4d5602ce6e0f661ac4fc524f3eeafe62a8aae52..8260460ab3b7284244cdbec7f822aca0c42fffd6 100644
--- a/main/astmm.c
+++ b/main/astmm.c
@@ -28,6 +28,7 @@
 	<support_level>core</support_level>
  ***/
 
+#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 27a700a9da33dc8278a140e8761cba0b9a4be232..c08880c69cb5d064b5e2adf13795f0b060f9f908 100644
--- a/main/hashtab.c
+++ b/main/hashtab.c
@@ -26,7 +26,7 @@
 	<support_level>core</support_level>
  ***/
 
-#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 a412eaf3493bb906d337634974a7d5eb46699f44..b1b2bd76dca8ffea3502308badba65143ee3a185 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 f146ffb096faf44fbd018711578881a98e7b7bee..9f1f19bb621ffa8bd2fa0235ef602387ac8626f7 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 5ab9c969f0256fb3b863ea636ae4d11e663e4e4b..e5c1655c550433b9bb05410bbabbfe49d88d27c4 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 c5eba92b76c8d521fd24cb4e9223ddec6b59d013..a7a20aa60f126c99a79057651ac6fff4f87e4fc9 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 d29bbcfbd9c35c2a684135bc987b34b6d5e63ce8..d5ea5accf03f9e9875180c45ad3506e54522fda5 100644
--- a/res/ael/pval.c
+++ b/res/ael/pval.c
@@ -27,7 +27,7 @@
 	<support_level>extended</support_level>
  ***/
 
-#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 42492273d8a0058766a87ec1740879c7e3089460..ddbb1784077bc1495d6aaa5b480a75a4a3b88818 100644
--- a/res/res_fax_spandsp.c
+++ b/res/res_fax_spandsp.c
@@ -48,12 +48,8 @@
 	<support_level>extended</support_level>
 ***/
 
-/* 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 <spandsp.h>
-#include <spandsp/version.h>
-
+/* 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 <spandsp.h>
+#include <spandsp/version.h>
+
 #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 bebcee11ec3407fce28e7ca1aab815f56979b110..f0e089fb6f2854768caa2b30fcdcb62eeecbe682 100644
--- a/res/snmp/agent.c
+++ b/res/snmp/agent.c
@@ -18,6 +18,8 @@
 	<support_level>extended</support_level>
  ***/
 
+/* 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 87298017256227b59a51ba22810fa331615307fb..baca11bf58dd6f8e2bc16eb148c4da4c67445353 100644
--- a/utils/extconf.c
+++ b/utils/extconf.c
@@ -43,7 +43,7 @@
 	<support_level>extended</support_level>
  ***/
 
-#define WRAP_LIBC_MALLOC
+#define ASTMM_LIBC ASTMM_REDIRECT
 #include "asterisk.h"
 
 #undef DEBUG_THREADS