From: Howard Chu Date: Mon, 13 Jun 2005 22:49:01 +0000 (+0000) Subject: ITS#3774 delete backend/overlay structures after a failed add X-Git-Tag: OPENLDAP_AC_BP~530 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=f84fc983fdfb59949450ef2fa12409e4c57d8030;p=openldap ITS#3774 delete backend/overlay structures after a failed add --- diff --git a/servers/slapd/backend.c b/servers/slapd/backend.c index 4552a6ac1c..7fc267a259 100644 --- a/servers/slapd/backend.c +++ b/servers/slapd/backend.c @@ -392,49 +392,54 @@ int backend_shutdown( Backend *be ) return 0; } +void backend_destroy_one( BackendDB *bd ) +{ + LDAP_STAILQ_REMOVE(&backendDB, bd, slap_backend_db, be_next ); + + if ( bd->be_syncinfo ) { + syncinfo_free( bd->be_syncinfo ); + } + + if ( bd->be_pending_csn_list ) { + struct slap_csn_entry *csne; + csne = LDAP_TAILQ_FIRST( bd->be_pending_csn_list ); + while ( csne ) { + struct slap_csn_entry *tmp_csne = csne; + + LDAP_TAILQ_REMOVE( bd->be_pending_csn_list, csne, ce_csn_link ); + ch_free( csne->ce_csn.bv_val ); + csne = LDAP_TAILQ_NEXT( csne, ce_csn_link ); + ch_free( tmp_csne ); + } + } + + if ( bd->bd_info->bi_db_destroy ) { + bd->bd_info->bi_db_destroy( bd ); + } + ber_bvarray_free( bd->be_suffix ); + ber_bvarray_free( bd->be_nsuffix ); + if ( !BER_BVISNULL( &bd->be_rootdn ) ) { + free( bd->be_rootdn.bv_val ); + } + if ( !BER_BVISNULL( &bd->be_rootndn ) ) { + free( bd->be_rootndn.bv_val ); + } + if ( !BER_BVISNULL( &bd->be_rootpw ) ) { + free( bd->be_rootpw.bv_val ); + } + acl_destroy( bd->be_acl, frontendDB->be_acl ); + free( bd ); +} + int backend_destroy(void) { int i; BackendDB *bd; BackendInfo *bi; - struct slap_csn_entry *csne; /* destroy each backend database */ while (( bd = LDAP_STAILQ_FIRST(&backendDB))) { - LDAP_STAILQ_REMOVE_HEAD(&backendDB, be_next); - - if ( bd->be_syncinfo ) { - syncinfo_free( bd->be_syncinfo ); - } - - if ( bd->be_pending_csn_list ) { - csne = LDAP_TAILQ_FIRST( bd->be_pending_csn_list ); - while ( csne ) { - struct slap_csn_entry *tmp_csne = csne; - - LDAP_TAILQ_REMOVE( bd->be_pending_csn_list, csne, ce_csn_link ); - ch_free( csne->ce_csn.bv_val ); - csne = LDAP_TAILQ_NEXT( csne, ce_csn_link ); - ch_free( tmp_csne ); - } - } - - if ( bd->bd_info->bi_db_destroy ) { - bd->bd_info->bi_db_destroy( bd ); - } - ber_bvarray_free( bd->be_suffix ); - ber_bvarray_free( bd->be_nsuffix ); - if ( !BER_BVISNULL( &bd->be_rootdn ) ) { - free( bd->be_rootdn.bv_val ); - } - if ( !BER_BVISNULL( &bd->be_rootndn ) ) { - free( bd->be_rootndn.bv_val ); - } - if ( !BER_BVISNULL( &bd->be_rootpw ) ) { - free( bd->be_rootpw.bv_val ); - } - acl_destroy( bd->be_acl, frontendDB->be_acl ); - free( bd ); + backend_destroy_one( bd ); } /* destroy each backend type */ diff --git a/servers/slapd/backover.c b/servers/slapd/backover.c index 0e8b0c27ac..047af4497b 100644 --- a/servers/slapd/backover.c +++ b/servers/slapd/backover.c @@ -659,6 +659,27 @@ overlay_register_control( BackendDB *be, const char *oid ) return rc; } +void +overlay_destroy_one( BackendDB *be, slap_overinst *on ) +{ + slap_overinfo *oi = on->on_info; + slap_overinst **oidx; + + for ( oidx = &oi->oi_list; *oidx; oidx = &(*oidx)->on_next ) { + if ( *oidx == on ) { + *oidx = on->on_next; + if ( on->on_bi.bi_db_destroy ) { + BackendInfo *bi_orig = be->bd_info; + be->bd_info = (BackendInfo *)on; + on->on_bi.bi_db_destroy( be ); + be->bd_info = bi_orig; + } + free( on ); + break; + } + } +} + /* add an overlay to a particular backend. */ int overlay_config( BackendDB *be, const char *ov ) diff --git a/servers/slapd/bconfig.c b/servers/slapd/bconfig.c index e375810105..e702927bc8 100644 --- a/servers/slapd/bconfig.c +++ b/servers/slapd/bconfig.c @@ -3169,6 +3169,10 @@ ok: Debug(LDAP_DEBUG_ANY, "%s: %s (%s)!\n", ca->log, ca->msg, ca->argv[1] ); rc = LDAP_OTHER; + if ( colst[0]->co_type == Cft_Database ) + backend_destroy_one( ca->be ); + else + overlay_destroy_one( ca->be, (slap_overinst *)ca->bi ); goto leave; } } diff --git a/servers/slapd/proto-slap.h b/servers/slapd/proto-slap.h index cedd69cef6..ee12a59ec3 100644 --- a/servers/slapd/proto-slap.h +++ b/servers/slapd/proto-slap.h @@ -258,6 +258,7 @@ LDAP_SLAPD_F (int) backend_startup_one LDAP_P((Backend *be)); LDAP_SLAPD_F (int) backend_sync LDAP_P((Backend *be)); LDAP_SLAPD_F (int) backend_shutdown LDAP_P((Backend *be)); LDAP_SLAPD_F (int) backend_destroy LDAP_P((void)); +LDAP_SLAPD_F (void) backend_destroy_one LDAP_P((BackendDB *bd)); LDAP_SLAPD_F (BackendInfo *) backend_info LDAP_P(( const char *type )); LDAP_SLAPD_F (BackendDB *) backend_db_init LDAP_P(( const char *type )); @@ -348,6 +349,9 @@ LDAP_SLAPD_F (int) glue_sub_init( void ); LDAP_SLAPD_F (int) overlay_register LDAP_P(( slap_overinst *on )); LDAP_SLAPD_F (int) overlay_config LDAP_P(( BackendDB *be, const char *ov )); +LDAP_SLAPD_F (void) overlay_destroy_one LDAP_P(( + BackendDB *be, + slap_overinst *on )); LDAP_SLAPD_F (slap_overinst *) overlay_next LDAP_P(( slap_overinst *on )); LDAP_SLAPD_F (slap_overinst *) overlay_find LDAP_P(( const char *name )); LDAP_SLAPD_F (int) overlay_is_over LDAP_P(( BackendDB *be ));