don't leak callbacks if stuff cannot be registered; provide a means to dispose of private stuff if required

This commit is contained in:
Pierangelo Masarati 2006-12-24 15:44:56 +00:00
parent c3960b98d3
commit 6193ee4003
5 changed files with 28 additions and 15 deletions

View File

@ -152,6 +152,7 @@ bdb_monitor_update(
return SLAP_CB_CONTINUE; return SLAP_CB_CONTINUE;
} }
#if 0 /* uncomment if required */
static int static int
bdb_monitor_modify( bdb_monitor_modify(
Operation *op, Operation *op,
@ -161,11 +162,12 @@ bdb_monitor_modify(
{ {
return SLAP_CB_CONTINUE; return SLAP_CB_CONTINUE;
} }
#endif
static int static int
bdb_monitor_free( bdb_monitor_free(
Entry *e, Entry *e,
void *priv ) void **priv )
{ {
struct berval values[ 2 ]; struct berval values[ 2 ];
Modification mod = { 0 }; Modification mod = { 0 };
@ -176,6 +178,7 @@ bdb_monitor_free(
int i, rc; int i, rc;
/* NOTE: if slap_shutdown != 0, priv might have already been freed */ /* NOTE: if slap_shutdown != 0, priv might have already been freed */
*priv = NULL;
/* Remove objectClass */ /* Remove objectClass */
mod.sm_op = LDAP_MOD_DELETE; mod.sm_op = LDAP_MOD_DELETE;

View File

@ -265,9 +265,11 @@ done:;
static int static int
ldap_back_monitor_free( ldap_back_monitor_free(
Entry *e, Entry *e,
void *priv ) void **priv )
{ {
ldapinfo_t *li = (ldapinfo_t *)priv; ldapinfo_t *li = (ldapinfo_t *)(*priv);
*priv = NULL;
if ( !slapd_shutdown && !BER_BVISNULL( &li->li_monitor_info.lmi_rdn ) ) { if ( !slapd_shutdown && !BER_BVISNULL( &li->li_monitor_info.lmi_rdn ) ) {
ldap_back_monitor_info_destroy( li ); ldap_back_monitor_info_destroy( li );
@ -306,7 +308,6 @@ static int
ldap_back_monitor_initialize( void ) ldap_back_monitor_initialize( void )
{ {
int i, code; int i, code;
const char *err;
ConfigArgs c; ConfigArgs c;
char *argv[ 3 ]; char *argv[ 3 ];

View File

@ -39,9 +39,13 @@ typedef struct monitor_callback_t {
int (*mc_modify)( Operation *op, SlapReply *rs, Entry *e, void *priv ); int (*mc_modify)( Operation *op, SlapReply *rs, Entry *e, void *priv );
/* modify callback /* modify callback
for user-defined entries */ for user-defined entries */
int (*mc_free)( Entry *e, void *priv ); int (*mc_free)( Entry *e, void **priv );
/* delete callback /* delete callback
for user-defined entries */ for user-defined entries */
void (*mc_dispose)( void **priv );
/* dispose callback
to dispose of the callback
private data itself */
void *mc_private; /* opaque pointer to void *mc_private; /* opaque pointer to
private data */ private data */
struct monitor_callback_t *mc_next; struct monitor_callback_t *mc_next;

View File

@ -405,7 +405,7 @@ monitor_entry_destroy( void *v_mc )
monitor_callback_t *next = cb->mc_next; monitor_callback_t *next = cb->mc_next;
if ( cb->mc_free ) { if ( cb->mc_free ) {
cb->mc_free( mc->mc_e, cb->mc_private ); (void)cb->mc_free( mc->mc_e, &cb->mc_private );
} }
ch_free( mp->mp_cb ); ch_free( mp->mp_cb );

View File

@ -992,7 +992,6 @@ done:;
return -1; return -1;
} }
done_limbo:;
if ( *elpp != NULL ) { if ( *elpp != NULL ) {
el.el_next = NULL; el.el_next = NULL;
**elpp = el; **elpp = el;
@ -1080,7 +1079,7 @@ monitor_back_unregister_entry(
monitor_callback_t *next = cb->mc_next; monitor_callback_t *next = cb->mc_next;
if ( cb->mc_free ) { if ( cb->mc_free ) {
(void)cb->mc_free( e, cb->mc_private ); (void)cb->mc_free( e, &cb->mc_private );
} }
ch_free( cb ); ch_free( cb );
@ -1208,7 +1207,7 @@ monitor_back_unregister_entry_parent(
for ( cbp = &mp->mp_cb; *cbp != NULL; cbp = &(*cbp)->mc_next ) { for ( cbp = &mp->mp_cb; *cbp != NULL; cbp = &(*cbp)->mc_next ) {
if ( *cbp == target_cb ) { if ( *cbp == target_cb ) {
if ( (*cbp)->mc_free ) { if ( (*cbp)->mc_free ) {
(void)(*cbp)->mc_free( e, (*cbp)->mc_private ); (void)(*cbp)->mc_free( e, &(*cbp)->mc_private );
} }
*cbp = (*cbp)->mc_next; *cbp = (*cbp)->mc_next;
ch_free( target_cb ); ch_free( target_cb );
@ -1370,7 +1369,7 @@ monitor_back_unregister_entry_attrs(
for ( cbp = &mp->mp_cb; *cbp != NULL; cbp = &(*cbp)->mc_next ) { for ( cbp = &mp->mp_cb; *cbp != NULL; cbp = &(*cbp)->mc_next ) {
if ( *cbp == target_cb ) { if ( *cbp == target_cb ) {
if ( (*cbp)->mc_free ) { if ( (*cbp)->mc_free ) {
(void)(*cbp)->mc_free( e, (*cbp)->mc_private ); (void)(*cbp)->mc_free( e, &(*cbp)->mc_private );
} }
*cbp = (*cbp)->mc_next; *cbp = (*cbp)->mc_next;
ch_free( target_cb ); ch_free( target_cb );
@ -1837,7 +1836,6 @@ monitor_back_initialize(
}; };
int i, rc; int i, rc;
const char *text;
monitor_info_t *mi = &monitor_info; monitor_info_t *mi = &monitor_info;
ConfigArgs c; ConfigArgs c;
char *argv[ 3 ]; char *argv[ 3 ];
@ -2231,10 +2229,11 @@ monitor_back_db_open(
for ( ; el; ) { for ( ; el; ) {
entry_limbo_t *tmp; entry_limbo_t *tmp;
int rc;
switch ( el->el_type ) { switch ( el->el_type ) {
case LIMBO_ENTRY: case LIMBO_ENTRY:
monitor_back_register_entry( rc = monitor_back_register_entry(
el->el_e, el->el_e,
el->el_cb, el->el_cb,
el->el_mss, el->el_mss,
@ -2242,7 +2241,7 @@ monitor_back_db_open(
break; break;
case LIMBO_ENTRY_PARENT: case LIMBO_ENTRY_PARENT:
monitor_back_register_entry_parent( rc = monitor_back_register_entry_parent(
el->el_e, el->el_e,
el->el_cb, el->el_cb,
el->el_mss, el->el_mss,
@ -2254,7 +2253,7 @@ monitor_back_db_open(
case LIMBO_ATTRS: case LIMBO_ATTRS:
monitor_back_register_entry_attrs( rc = monitor_back_register_entry_attrs(
&el->el_ndn, &el->el_ndn,
el->el_a, el->el_a,
el->el_cb, el->el_cb,
@ -2264,7 +2263,7 @@ monitor_back_db_open(
break; break;
case LIMBO_CB: case LIMBO_CB:
monitor_back_register_entry_callback( rc = monitor_back_register_entry_callback(
&el->el_ndn, &el->el_ndn,
el->el_cb, el->el_cb,
&el->el_nbase, &el->el_nbase,
@ -2291,6 +2290,12 @@ monitor_back_db_open(
if ( !BER_BVISNULL( &el->el_filter ) ) { if ( !BER_BVISNULL( &el->el_filter ) ) {
ber_memfree( el->el_filter.bv_val ); ber_memfree( el->el_filter.bv_val );
} }
if ( el->el_cb && rc != 0 ) {
if ( el->el_cb->mc_dispose ) {
el->el_cb->mc_dispose( &el->el_cb->mc_private );
}
ch_free( el->el_cb );
}
tmp = el; tmp = el;
el = el->el_next; el = el->el_next;