]> git.sur5r.net Git - openldap/commitdiff
ITS#4614 - complain if glue/subordinate are attempted on the same backend
authorHoward Chu <hyc@openldap.org>
Sat, 15 Jul 2006 00:18:44 +0000 (00:18 +0000)
committerHoward Chu <hyc@openldap.org>
Sat, 15 Jul 2006 00:18:44 +0000 (00:18 +0000)
cleanup overlay list if overlay db_init fails.

servers/slapd/backglue.c
servers/slapd/backover.c

index 21b7e52ae126dc92be3a7783b5bc548371c7726b..cce5905ee1b827595b6ea2bd2a8037e8765a0804 100644 (file)
@@ -262,6 +262,13 @@ glue_chk_controls ( Operation *op, SlapReply *rs )
        return rc;
 }
 
+/* ITS#4615 - overlays configured above the glue overlay should be
+ * invoked for the entire glued tree. Overlays configured below the
+ * glue overlay should only be invoked on the master backend.
+ * So, if we're searching on any subordinates, we need to force the
+ * current overlay chain to stop processing, without stopping the
+ * overall callback flow.
+ */
 static int
 glue_sub_search( Operation *op, SlapReply *rs, BackendDB *b0,
        slap_overinst *on )
@@ -775,6 +782,13 @@ glue_db_init(
        BackendInfo     *bi = oi->oi_orig;
        glueinfo *gi;
 
+       if ( SLAP_GLUE_SUBORDINATE( be )) {
+               Debug( LDAP_DEBUG_ANY, "glue: backend %s is already subordinate, "
+                       "cannot have glue overlay!\n",
+                       be->be_suffix[0].bv_val, 0, 0 );
+               return LDAP_OTHER;
+       }
+
        gi = ch_calloc( 1, sizeof(glueinfo));
        on->on_bi.bi_private = gi;
        dnParent( be->be_nsuffix, &gi->gi_pdn );
@@ -960,6 +974,12 @@ glue_sub_add( BackendDB *be, int advert, int online )
        glue_Addrec *ga;
        int rc = 0;
 
+       if ( overlay_is_inst( be, "glue" )) {
+               Debug( LDAP_DEBUG_ANY, "glue: backend %s already has glue overlay, "
+                       "cannot be a subordinate!\n",
+                       be->be_suffix[0].bv_val, 0, 0 );
+               return LDAP_OTHER;
+       }
        SLAP_DBFLAGS( be ) |= SLAP_DBFLAG_GLUE_SUBORDINATE;
        if ( advert )
                SLAP_DBFLAGS( be ) |= SLAP_DBFLAG_GLUE_ADVERTISE;
index 3128840ce9f541c2f470526ae947ab698f1d2327..f14b327019ee72e5a25a283346ff22911a15a439 100644 (file)
@@ -1054,7 +1054,11 @@ overlay_config( BackendDB *be, const char *ov )
                be->bd_info = (BackendInfo *)on2;
                rc = on2->on_bi.bi_db_init( be );
                be->bd_info = (BackendInfo *)oi;
-               if ( rc ) return rc;
+               if ( rc ) {
+                       oi->oi_list = on2->on_next;
+                       ch_free( on2 );
+                       return rc;
+               }
        }
 
        return 0;