From 3c03b13d09f659fffce79eb45099deb4389f7ef7 Mon Sep 17 00:00:00 2001 From: Kurt Zeilenga <kurt@openldap.org> Date: Fri, 28 Jul 2006 16:31:18 +0000 Subject: [PATCH] ITS#4614 fix from HEAD --- servers/slapd/backglue.c | 20 ++++++++++++++++++++ servers/slapd/backover.c | 6 +++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/servers/slapd/backglue.c b/servers/slapd/backglue.c index 202c63cd9d..6487a2d2bc 100644 --- a/servers/slapd/backglue.c +++ b/servers/slapd/backglue.c @@ -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 ) @@ -769,6 +776,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 ); @@ -954,6 +968,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; diff --git a/servers/slapd/backover.c b/servers/slapd/backover.c index 5585f9a2ff..88bd173180 100644 --- a/servers/slapd/backover.c +++ b/servers/slapd/backover.c @@ -958,7 +958,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; -- GitLab