From 09fe2bc9050db991e59b288d1d8050be96c53c15 Mon Sep 17 00:00:00 2001 From: Kurt Zeilenga Date: Wed, 2 Jun 1999 21:34:34 +0000 Subject: [PATCH] Add experimental wrong heap detection behind LDAP_MEMORY_DEBUG macro. --- libraries/liblber/memory.c | 54 +++++++++++++++++++++++++++++++++++++- 1 file changed, 53 insertions(+), 1 deletion(-) diff --git a/libraries/liblber/memory.c b/libraries/liblber/memory.c index 5c3910f44a..8b95a18eb3 100644 --- a/libraries/liblber/memory.c +++ b/libraries/liblber/memory.c @@ -9,8 +9,20 @@ #include "lber-int.h" -BerMemoryFunctions *ber_int_memory_fns = NULL; +#ifdef LDAP_MEMORY_DEBUG +struct ber_mem_hdr { + union bmu_align_u { + size_t bmu_size_t; + void * bmu_voidp; + double bmu_double; + long bmu_long; + } ber_align; +#define bm_junk ber_align.bmu_size_t +}; +#define BER_MEM_JUNK 0xddeeddeeU +#endif +BerMemoryFunctions *ber_int_memory_fns = NULL; void ber_memfree( void *p ) @@ -26,12 +38,20 @@ ber_memfree( void *p ) } if( ber_int_memory_fns == NULL ) { +#ifdef LDAP_MEMORY_DEBUG + struct ber_mem_hdr *mh = (struct ber_mem_hdr *) + ((char *)p - sizeof(struct ber_mem_hdr)); + assert( mh->bm_junk == BER_MEM_JUNK ); + free( mh ); +#else free( p ); +#endif return; } assert( ber_int_memory_fns->bmf_free ); + (*ber_int_memory_fns->bmf_free)( p ); } @@ -65,7 +85,17 @@ ber_memalloc( size_t s ) } if( ber_int_memory_fns == NULL ) { +#ifdef LDAP_MEMORY_DEBUG + struct ber_mem_hdr *mh = malloc(s + sizeof(struct ber_mem_hdr)); + + if( mh == NULL ) return NULL; + + mh->bm_junk = BER_MEM_JUNK; + + return &mh[1]; +#else return malloc( s ); +#endif } assert( ber_int_memory_fns->bmf_malloc ); @@ -88,7 +118,15 @@ ber_memcalloc( size_t n, size_t s ) } if( ber_int_memory_fns == NULL ) { +#ifdef LDAP_MEMORY_DEBUG + struct ber_mem_hdr *mh = calloc(1, + (n * s) + sizeof(struct ber_mem_hdr) ); + + mh->bm_junk = BER_MEM_JUNK; + return &mh[1]; +#else return calloc( n, s ); +#endif } assert( ber_int_memory_fns->bmf_calloc ); @@ -114,7 +152,21 @@ ber_memrealloc( void* p, size_t s ) } if( ber_int_memory_fns == NULL ) { +#ifdef LDAP_MEMORY_DEBUG + struct ber_mem_hdr *mh = (struct ber_mem_hdr *) + ((char *)p - sizeof(struct ber_mem_hdr)); + assert( mh->bm_junk == BER_MEM_JUNK ); + + p = realloc( mh, s ); + + if( p == NULL ) return NULL; + + mh = p; + + return &mh[1]; +#else return realloc( p, s ); +#endif } assert( ber_int_memory_fns->bmf_realloc ); -- 2.39.5