MALLOC_DEBUG: Replace WRAP_LIBC_MALLOC with ASTMM_LIBC.

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
This commit is contained in:
Corey Farrell 2015-05-12 09:58:52 -04:00
parent 3858e67dd5
commit 478fb4a388
16 changed files with 98 additions and 44 deletions

View 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"

View File

@ -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

View 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.
*
* @{
*/
#ifdef WRAP_LIBC_MALLOC
/*!
* \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
#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 */

View 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>

View 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>

View File

@ -1,4 +1,4 @@
#define WRAP_LIBC_MALLOC
#define ASTMM_LIBC ASTMM_REDIRECT
#include "asterisk.h"
#line 2 "ast_expr2f.c"

View 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. */

View 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()

View File

@ -68,7 +68,7 @@
%option bison-locations
%{
#define WRAP_LIBC_MALLOC
#define ASTMM_LIBC ASTMM_REDIRECT
#include "asterisk.h"
ASTERISK_REGISTER_FILE()

View File

@ -99,7 +99,7 @@
*
*/
#define WRAP_LIBC_MALLOC
#define ASTMM_LIBC ASTMM_REDIRECT
#include "asterisk.h"
ASTERISK_REGISTER_FILE()

View File

@ -22,7 +22,7 @@
*
*/
#define WRAP_LIBC_MALLOC
#define ASTMM_LIBC ASTMM_REDIRECT
#include "asterisk.h"
ASTERISK_REGISTER_FILE()

View File

@ -1,4 +1,4 @@
#define WRAP_LIBC_MALLOC
#define ASTMM_LIBC ASTMM_REDIRECT
#include "asterisk.h"
#line 2 "ael_lex.c"

View 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()

View File

@ -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

View 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()

View 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