From: Quanah Gibson-Mount Date: Mon, 7 Nov 2011 20:00:33 +0000 (-0800) Subject: Disallow removing global and cn=config overlays for now. X-Git-Tag: OPENLDAP_REL_ENG_2_4_27~70 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=6b010eff6089e4002f6f39bc26f8c6efc8a6551f;p=openldap Disallow removing global and cn=config overlays for now. Those require some special handling. --- diff --git a/servers/slapd/backover.c b/servers/slapd/backover.c index 5d15d39ac0..36950a584b 100644 --- a/servers/slapd/backover.c +++ b/servers/slapd/backover.c @@ -1142,7 +1142,6 @@ overlay_remove( BackendDB *be, slap_overinst *on ) if ( ! oi->oi_list ) { /* reset db flags and bd_info to orig */ - SLAP_DBFLAGS( be ) &= ~SLAP_DBFLAG_GLOBAL_OVERLAY; be->bd_info = oi->oi_orig; ch_free(oi); } diff --git a/servers/slapd/bconfig.c b/servers/slapd/bconfig.c index 9eece79e92..38e8e888ec 100644 --- a/servers/slapd/bconfig.c +++ b/servers/slapd/bconfig.c @@ -6094,6 +6094,33 @@ config_back_delete( Operation *op, SlapReply *rs ) overlay_remove( ce->ce_be, (slap_overinst *)ce->ce_bi ); + if ( ce->ce_type == Cft_Overlay ){ + if ( SLAP_ISGLOBALOVERLAY(ce->ce_be ) ) { + rs->sr_err = LDAP_UNWILLING_TO_PERFORM; + rs->sr_text = "Cannot delete global overlays"; + ldap_pvt_thread_pool_resume( &connection_pool ); + goto out; + } else if ( ce->ce_be == op->o_bd->bd_self ) { + rs->sr_err = LDAP_UNWILLING_TO_PERFORM; + rs->sr_text = "Cannot delete cn=config overlays"; + ldap_pvt_thread_pool_resume( &connection_pool ); + goto out; + } else { + overlay_remove( ce->ce_be, (slap_overinst *)ce->ce_bi ); + } + } else { /* Cft_Database*/ + if ( ce->ce_be == frontendDB || ce->ce_be == op->o_bd ){ + rs->sr_err = LDAP_UNWILLING_TO_PERFORM; + rs->sr_text = "Cannot delete config or frontend database"; + ldap_pvt_thread_pool_resume( &connection_pool ); + goto out; + } + if ( ce->ce_be->bd_info->bi_db_close ) { + ce->ce_be->bd_info->bi_db_close( ce->ce_be, NULL ); + } + backend_destroy_one( ce->ce_be, 1); + } + /* remove CfEntryInfo from the siblings list */ if ( ce->ce_parent->ce_kids == ce ) { ce->ce_parent->ce_kids = ce->ce_sibs;