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