]> git.sur5r.net Git - openldap/commitdiff
Disallow removing global and cn=config overlays for now.
authorQuanah Gibson-Mount <quanah@openldap.org>
Mon, 7 Nov 2011 20:00:33 +0000 (12:00 -0800)
committerQuanah Gibson-Mount <quanah@openldap.org>
Mon, 7 Nov 2011 20:00:33 +0000 (12:00 -0800)
Those require some special handling.

servers/slapd/backover.c
servers/slapd/bconfig.c

index 5d15d39ac0cc0f09a6c83a3b0c74bab474153230..36950a584bb5fea9faf4704dfc9a5be518c24d6c 100644 (file)
@@ -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);
        }
index 9eece79e92bf641187f2b02e693df3f9f8275349..38e8e888ec2d052ee38d2a795cf78fece4db28cf 100644 (file)
@@ -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;