]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
MALLOC_DEBUG: Replace WRAP_LIBC_MALLOC with ASTMM_LIBC. 42/442/4
authorCorey Farrell <git@cfware.com>
Tue, 12 May 2015 13:58:52 +0000 (09:58 -0400)
committerCorey Farrell <git@cfware.com>
Thu, 14 May 2015 01:55:07 +0000 (21:55 -0400)
There are 3 ways that calls directly to standard allocator functions can
be dealt with:
1. Block their use, cause them to generate an error.  This is the default.
2. Replace them with the Asterisk equivalent function calls.
3. Leave them alone.

This change allows one of these 3 options to be selected by any source.
The source just needs to define ASTMM_LIBC to ASTMM_BLOCK, ASTMM_REDIRECT,
or ASTMM_IGNORE to use option 1, 2 or 3 respectively.  Normally ASTMM_BLOCK
is the correct option, so it is default when ASTMM_LIBC is not defined.
In some cases when building 3rd party code it is desirable to have it use
Asterisk functions, without changing the whole source - ASTMM_REDIRECT
accomplishes this.  When using 3rd party libraries sometimes a static
inline function will make use of malloc or free.  In these cases it may
be unsafe to replace the allocator in the header, as it's possible the
memory could be freed by the library using standard allocators.  For
those cases ASTMM_IGNORE is needed.

Change-Id: I8afef4bc7f3b93914263ae27d3a5858b69663fc7

16 files changed:
codecs/lpc10/lpcini.c
contrib/scripts/get_mp3_source.sh
include/asterisk/astmm.h
main/ast_expr2.c
main/ast_expr2.y
main/ast_expr2f.c
main/astmm.c
main/hashtab.c
res/ael/ael.flex
res/ael/ael.tab.c
res/ael/ael.y
res/ael/ael_lex.c
res/ael/pval.c
res/res_fax_spandsp.c
res/snmp/agent.c
utils/extconf.c

index 8efb640680d1b3397d541a2e9f7d6c937c00e926..ea68176e3d5d2c4db6c13fcbf8f357f11fac21fa 100644 (file)
@@ -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"
 
index 860e2bc02fe20be7da6dee760565e66819236342..6d984659dab275873d2fd3f06f1d4c4df10ce810 100755 (executable)
@@ -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
 
index 1d778d4c5388c5eaf8980492825b5510f453d10c..6c9a8aeeeb2d777d9acbc521f4d3bb8d09481924 100644 (file)
@@ -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 */
index 84a3d7b977e0e6c8209184104234a7f09ec84b93..d41072d6e4b6867be14d2c1c0921d41ac0a24b95 100644 (file)
@@ -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>
index 8a151679d2cd67ce7f3853eb4ca8a515654f01cf..762e83d840f6b829ba9dac105506f0a821b0177f 100644 (file)
@@ -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>
index c2d4e00a4b15b3f062be8191b01ab131f6f199e7..c6a1b97353bd86710b0168acfd29454465fabee1 100644 (file)
@@ -1,4 +1,4 @@
-#define WRAP_LIBC_MALLOC
+#define ASTMM_LIBC ASTMM_REDIRECT
 #include "asterisk.h"
 
 #line 2 "ast_expr2f.c"
index a4d5602ce6e0f661ac4fc524f3eeafe62a8aae52..8260460ab3b7284244cdbec7f822aca0c42fffd6 100644 (file)
@@ -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. */
index 27a700a9da33dc8278a140e8761cba0b9a4be232..c08880c69cb5d064b5e2adf13795f0b060f9f908 100644 (file)
@@ -26,7 +26,7 @@
        <support_level>core</support_level>
  ***/
 
-#define WRAP_LIBC_MALLOC
+#define ASTMM_LIBC ASTMM_REDIRECT
 #include "asterisk.h"
 
 ASTERISK_REGISTER_FILE()
index a412eaf3493bb906d337634974a7d5eb46699f44..b1b2bd76dca8ffea3502308badba65143ee3a185 100644 (file)
@@ -68,7 +68,7 @@
 %option bison-locations
 
 %{
-#define WRAP_LIBC_MALLOC
+#define ASTMM_LIBC ASTMM_REDIRECT
 #include "asterisk.h"
 ASTERISK_REGISTER_FILE()
 
index f146ffb096faf44fbd018711578881a98e7b7bee..9f1f19bb621ffa8bd2fa0235ef602387ac8626f7 100644 (file)
@@ -99,7 +99,7 @@
  *
  */
 
-#define WRAP_LIBC_MALLOC
+#define ASTMM_LIBC ASTMM_REDIRECT
 #include "asterisk.h"
 
 ASTERISK_REGISTER_FILE()
index 5ab9c969f0256fb3b863ea636ae4d11e663e4e4b..e5c1655c550433b9bb05410bbabbfe49d88d27c4 100644 (file)
@@ -22,7 +22,7 @@
  *
  */
 
-#define WRAP_LIBC_MALLOC
+#define ASTMM_LIBC ASTMM_REDIRECT
 #include "asterisk.h"
 
 ASTERISK_REGISTER_FILE()
index c5eba92b76c8d521fd24cb4e9223ddec6b59d013..a7a20aa60f126c99a79057651ac6fff4f87e4fc9 100644 (file)
@@ -1,4 +1,4 @@
-#define WRAP_LIBC_MALLOC
+#define ASTMM_LIBC ASTMM_REDIRECT
 #include "asterisk.h"
 
 #line 2 "ael_lex.c"
index d29bbcfbd9c35c2a684135bc987b34b6d5e63ce8..d5ea5accf03f9e9875180c45ad3506e54522fda5 100644 (file)
@@ -27,7 +27,7 @@
        <support_level>extended</support_level>
  ***/
 
-#define WRAP_LIBC_MALLOC
+#define ASTMM_LIBC ASTMM_REDIRECT
 #include "asterisk.h"
 
 ASTERISK_REGISTER_FILE()
index 42492273d8a0058766a87ec1740879c7e3089460..ddbb1784077bc1495d6aaa5b480a75a4a3b88818 100644 (file)
        <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
index bebcee11ec3407fce28e7ca1aab815f56979b110..f0e089fb6f2854768caa2b30fcdcb62eeecbe682 100644 (file)
@@ -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()
index 87298017256227b59a51ba22810fa331615307fb..baca11bf58dd6f8e2bc16eb148c4da4c67445353 100644 (file)
@@ -43,7 +43,7 @@
        <support_level>extended</support_level>
  ***/
 
-#define WRAP_LIBC_MALLOC
+#define ASTMM_LIBC ASTMM_REDIRECT
 #include "asterisk.h"
 
 #undef DEBUG_THREADS