From c90c9f36896eb93ca071df09dc90c35550e0e8e5 Mon Sep 17 00:00:00 2001
From: Pierangelo Masarati <ando@openldap.org>
Date: Sun, 12 Dec 2004 23:23:00 +0000
Subject: [PATCH] don't try to send results on abandon (ITS#3434)

---
 servers/slapd/back-relay/init.c |  2 --
 servers/slapd/back-relay/op.c   | 20 +++++++++++---------
 2 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/servers/slapd/back-relay/init.c b/servers/slapd/back-relay/init.c
index 290085afbc..0692a15fb3 100644
--- a/servers/slapd/back-relay/init.c
+++ b/servers/slapd/back-relay/init.c
@@ -50,9 +50,7 @@ relay_back_initialize( BackendInfo *bi )
 	bi->bi_op_modrdn = relay_back_op_modrdn;
 	bi->bi_op_add = relay_back_op_add;
 	bi->bi_op_delete = relay_back_op_delete;
-#if 0	/* causes a deadlock */
 	bi->bi_op_abandon = relay_back_op_abandon;
-#endif
 	bi->bi_op_cancel = relay_back_op_cancel;
 	bi->bi_extended = relay_back_op_extended;
 	bi->bi_entry_release_rw = relay_back_entry_release_rw;
diff --git a/servers/slapd/back-relay/op.c b/servers/slapd/back-relay/op.c
index 669da91f49..4b6912ee7a 100644
--- a/servers/slapd/back-relay/op.c
+++ b/servers/slapd/back-relay/op.c
@@ -47,6 +47,13 @@ relay_back_add_cb( slap_callback *cb, struct slap_op *op )
 	op->o_callback = cb;
 }
 
+/*
+ * selects the backend if not enforced at config;
+ * in case of failure, behaves based on err:
+ *	-1			don't send result
+ *	LDAP_SUCCESS		don't send result; may send referral
+ *	any valid error 	send as error result
+ */
 static BackendDB *
 relay_back_select_backend( struct slap_op *op, struct slap_rep *rs, int err )
 {
@@ -56,16 +63,16 @@ relay_back_select_backend( struct slap_op *op, struct slap_rep *rs, int err )
 	if ( bd == NULL ) {
 		bd = select_backend( &op->o_req_ndn, 0, 1 );
 		if ( bd == op->o_bd ) {
-			if ( err != LDAP_SUCCESS ) {
+			if ( err > LDAP_SUCCESS ) {
 				send_ldap_error( op, rs,
 						LDAP_UNWILLING_TO_PERFORM, 
-						"would call self" );
+						"back-relay would call self" );
 			}
 			return NULL;
 		}
 	}
 
-	if ( bd == NULL ) {
+	if ( bd == NULL && err > -1 ) {
 		if ( default_referral ) {
 			rs->sr_ref = referral_rewrite( default_referral,
 				NULL, &op->o_req_dn, LDAP_SCOPE_DEFAULT );
@@ -368,7 +375,7 @@ relay_back_op_abandon( struct slap_op *op, struct slap_rep *rs )
 	BackendDB		*bd;
 	int			rc = 1;
 
-	bd = relay_back_select_backend( op, rs, LDAP_NO_SUCH_OBJECT );
+	bd = relay_back_select_backend( op, rs, -1 );
 	if ( bd == NULL ) {
 		return 1;
 	}
@@ -386,11 +393,6 @@ relay_back_op_abandon( struct slap_op *op, struct slap_rep *rs )
 		if ( op->o_callback == &cb ) {
 			op->o_callback = op->o_callback->sc_next;
 		}
-
-	} else {
-		send_ldap_error( op, rs, LDAP_UNWILLING_TO_PERFORM,
-				"operation not supported "
-				"within naming context" );
 	}
 
 	return rc;
-- 
GitLab