From c71d56cf80025ae81920cc4596db61298f62553b Mon Sep 17 00:00:00 2001
From: Quanah Gibson-Mount <quanah@openldap.org>
Date: Wed, 26 Jan 2011 19:09:24 +0000
Subject: [PATCH] ITS#6792

---
 CHANGES                      |  1 +
 servers/slapd/overlays/rwm.c | 20 +++++++-------------
 2 files changed, 8 insertions(+), 13 deletions(-)

diff --git a/CHANGES b/CHANGES
index cf910c1297..c18aca4933 100644
--- a/CHANGES
+++ b/CHANGES
@@ -95,6 +95,7 @@ OpenLDAP 2.4.24 Engineering
 	Fixed slapo-rwm double free (ITS#6720)
 	Fixed slapo-rwm crasher (ITS#6632)
 	Fixed slapo-rwm entry handling (ITS#6760)
+	Fixed slapo-rwm response hang (ITS#6792)
 	Fixed slapo-sssvlv initialization (ITS#6649)
 	Fixed slapo-sssvlv to not advertise when unused (ITS#6647)
 	Fixed slapo-sssvlv fix result code (ITS#6685)
diff --git a/servers/slapd/overlays/rwm.c b/servers/slapd/overlays/rwm.c
index ae85c4872f..fd2cacada6 100644
--- a/servers/slapd/overlays/rwm.c
+++ b/servers/slapd/overlays/rwm.c
@@ -1158,7 +1158,7 @@ rwm_extended( Operation *op, SlapReply *rs )
 	return SLAP_CB_CONTINUE;
 }
 
-static int
+static void
 rwm_matched( Operation *op, SlapReply *rs )
 {
 	slap_overinst		*on = (slap_overinst *) op->o_bd->bd_info;
@@ -1170,7 +1170,7 @@ rwm_matched( Operation *op, SlapReply *rs )
 	int			rc;
 
 	if ( rs->sr_matched == NULL ) {
-		return SLAP_CB_CONTINUE;
+		return;
 	}
 
 	dc.rwmap = rwmap;
@@ -1183,10 +1183,8 @@ rwm_matched( Operation *op, SlapReply *rs )
 	if ( rc != LDAP_SUCCESS ) {
 		rs->sr_err = rc;
 		rs->sr_text = "Rewrite error";
-		return 1;
-	}
 
-	if ( mdn.bv_val != dn.bv_val ) {
+	} else if ( mdn.bv_val != dn.bv_val ) {
 		if ( rs->sr_flags & REP_MATCHED_MUSTBEFREED ) {
 			ch_free( (void *)rs->sr_matched );
 
@@ -1195,8 +1193,6 @@ rwm_matched( Operation *op, SlapReply *rs )
 		}
 		rs->sr_matched = mdn.bv_val;
 	}
-	
-	return SLAP_CB_CONTINUE;
 }
 
 static int
@@ -1764,20 +1760,18 @@ rwm_response( Operation *op, SlapReply *rs )
 			dc.rs = NULL; 
 			dc.ctx = "referralDN";
 			rc = rwm_referral_result_rewrite( &dc, rs->sr_ref );
+			/* FIXME: impossible, so far */
 			if ( rc != LDAP_SUCCESS ) {
-				rc = 1;
+				rs->sr_err = rc;
 				break;
 			}
 		}
-		rc = rwm_matched( op, rs );
-		break;
 
-	default:
-		rc = SLAP_CB_CONTINUE;
+		rwm_matched( op, rs );
 		break;
 	}
 
-	return rc;
+	return SLAP_CB_CONTINUE;
 }
 
 static int
-- 
GitLab