From c789d494c40b3816dcbd4929d720eb4248dee4da Mon Sep 17 00:00:00 2001 From: Pierangelo Masarati Date: Wed, 20 Jul 2005 19:07:04 +0000 Subject: [PATCH] allow to unregister (and free) memory handling functions --- libraries/liblber/options.c | 44 ++++++++++++++++++++++++++++--------- servers/slapd/sl_malloc.c | 2 ++ 2 files changed, 36 insertions(+), 10 deletions(-) diff --git a/libraries/liblber/options.c b/libraries/liblber/options.c index 11a44c265c..56769ed628 100644 --- a/libraries/liblber/options.c +++ b/libraries/liblber/options.c @@ -43,10 +43,12 @@ ber_get_option( } if(item == NULL) { - if(option == LBER_OPT_BER_DEBUG) { + switch ( option ) { + case LBER_OPT_BER_DEBUG: * (int *) outvalue = ber_int_debug; return LBER_OPT_SUCCESS; - } else if(option == LBER_OPT_MEMORY_INUSE) { + + case LBER_OPT_MEMORY_INUSE: /* The memory inuse is a global variable on kernal implementations. * This means that memory debug is shared by all LDAP processes * so for this variable to have much meaning, only one LDAP process @@ -60,7 +62,7 @@ ber_get_option( #else return LBER_OPT_ERROR; #endif - } else if(option == LBER_OPT_LOG_PRINT_FILE) { + case LBER_OPT_LOG_PRINT_FILE: *((FILE**)outvalue) = (FILE*)ber_pvt_err_file; return LBER_OPT_SUCCESS; } @@ -124,11 +126,10 @@ ber_set_option( if( (ber_int_options.lbo_valid == LBER_UNINITIALIZED) && ( ber_int_memory_fns == NULL ) && ( option == LBER_OPT_MEMORY_FNS ) - && ( invalue != NULL )) + && ( invalue != NULL ) ) { const BerMemoryFunctions *f = (const BerMemoryFunctions *) invalue; - /* make sure all functions are provided */ if(!( f->bmf_malloc && f->bmf_calloc && f->bmf_realloc && f->bmf_free )) @@ -151,6 +152,25 @@ ber_set_option( return LBER_OPT_SUCCESS; } + if ( option == LBER_OPT_MEMORY_FNS ) { + if ( ber_int_options.lbo_valid != LBER_INITIALIZED ) { + return LBER_OPT_ERROR; + } + + if ( invalue != NULL ) { + return LBER_OPT_ERROR; + } + + if ( ber_int_memory_fns == NULL ) { + return LBER_OPT_ERROR; + } + + ber_int_memory_fns->bmf_free( ber_int_memory_fns, NULL ); + ber_int_memory_fns = NULL; + ber_int_options.lbo_valid = LBER_UNINITIALIZED; + return LBER_OPT_SUCCESS; + } + ber_int_options.lbo_valid = LBER_INITIALIZED; if(invalue == NULL) { @@ -160,17 +180,20 @@ ber_set_option( } if(item == NULL) { - if(option == LBER_OPT_BER_DEBUG) { + switch ( option ) { + case LBER_OPT_BER_DEBUG: ber_int_debug = * (const int *) invalue; return LBER_OPT_SUCCESS; - } else if(option == LBER_OPT_LOG_PRINT_FN) { + case LBER_OPT_LOG_PRINT_FN: ber_pvt_log_print = (BER_LOG_PRINT_FN) invalue; return LBER_OPT_SUCCESS; - } else if(option == LBER_OPT_LOG_PRINT_FILE) { + + case LBER_OPT_LOG_PRINT_FILE: ber_pvt_err_file = (void *) invalue; return LBER_OPT_SUCCESS; - } else if(option == LBER_OPT_MEMORY_INUSE) { + + case LBER_OPT_MEMORY_INUSE: /* The memory inuse is a global variable on kernal implementations. * This means that memory debug is shared by all LDAP processes * so for this variable to have much meaning, only one LDAP process @@ -184,8 +207,9 @@ ber_set_option( #else return LBER_OPT_ERROR; #endif - } else if(option == LBER_OPT_LOG_PROC) { + case LBER_OPT_LOG_PROC: ber_int_log_proc = (BER_LOG_FN)invalue; + return LBER_OPT_SUCCESS; } ber_errno = LBER_ERROR_PARAM; diff --git a/servers/slapd/sl_malloc.c b/servers/slapd/sl_malloc.c index e5d78627dd..5b591e9eda 100644 --- a/servers/slapd/sl_malloc.c +++ b/servers/slapd/sl_malloc.c @@ -73,6 +73,8 @@ slap_sl_mem_destroy( ber_memfree_x(sh->sh_base, NULL); ber_memfree_x(sh, NULL); } + + ber_set_option( NULL, LBER_OPT_MEMORY_FNS, NULL ); } BerMemoryFunctions slap_sl_mfuncs = -- 2.39.5