From 3a31cc637e9ea8a46ba70fe6809ef37182071797 Mon Sep 17 00:00:00 2001
From: Quanah Gibson-Mount <quanah@openldap.org>
Date: Tue, 24 Nov 2009 01:53:26 +0000
Subject: [PATCH] ITS#6397

---
 CHANGES                           |  1 +
 servers/slapd/overlays/syncprov.c | 11 ++++++-----
 2 files changed, 7 insertions(+), 5 deletions(-)

diff --git a/CHANGES b/CHANGES
index aef0d0f427..e6207e5c81 100644
--- a/CHANGES
+++ b/CHANGES
@@ -38,6 +38,7 @@ OpenLDAP 2.4.20 Engineering
 	Fixed slapo-syncprov deadlock (ITS#6335)
 	Fixed slapo-syncprov memory leak (ITS#6376)
 	Fixed slapo-syncprov out of order changes (ITS#6346)
+	Fixed slapo-syncprov psearch with stale cookie (ITS#6397)
 	Build Environment
 		Added additional operations for ITS#6332
 		Fixed memrchr define (ITS#6351)
diff --git a/servers/slapd/overlays/syncprov.c b/servers/slapd/overlays/syncprov.c
index 7fb91455af..675568e7f2 100644
--- a/servers/slapd/overlays/syncprov.c
+++ b/servers/slapd/overlays/syncprov.c
@@ -2473,6 +2473,8 @@ syncprov_op_search( Operation *op, SlapReply *rs )
 						changed = SS_CHANGED;
 					else if ( newer > 0 ) {
 					/* our state is older, tell consumer nothing */
+						rs->sr_err = LDAP_SUCCESS;
+bailout:
 						if ( sop ) {
 							syncops **sp = &si->si_ops;
 							
@@ -2483,7 +2485,6 @@ syncprov_op_search( Operation *op, SlapReply *rs )
 							ldap_pvt_thread_mutex_unlock( &si->si_ops_mutex );
 							ch_free( sop );
 						}
-						rs->sr_err = LDAP_SUCCESS;
 						rs->sr_ctrls = NULL;
 						send_ldap_result( op, rs );
 						return rs->sr_err;
@@ -2538,8 +2539,9 @@ no_change:		if ( !(op->o_sync_mode & SLAP_SYNC_PERSIST) ) {
 					ber_bvarray_free_x( ctxcsn, op->o_tmpmemctx );
 				if ( sids )
 					op->o_tmpfree( sids, op->o_tmpmemctx );
-				send_ldap_error( op, rs, LDAP_SYNC_REFRESH_REQUIRED, "sync cookie is stale" );
-				return rs->sr_err;
+				rs->sr_err = LDAP_SYNC_REFRESH_REQUIRED;
+				rs->sr_text = "sync cookie is stale";
+				goto bailout;
 			}
 			if ( srs->sr_state.ctxcsn ) {
 				ber_bvarray_free_x( srs->sr_state.ctxcsn, op->o_tmpmemctx );
@@ -2559,8 +2561,7 @@ no_change:		if ( !(op->o_sync_mode & SLAP_SYNC_PERSIST) ) {
 					ber_bvarray_free_x( ctxcsn, op->o_tmpmemctx );
 				if ( sids )
 					op->o_tmpfree( sids, op->o_tmpmemctx );
-				send_ldap_result( op, rs );
-				return rs->sr_err;
+				goto bailout;
 			}
 		}
 	} else {
-- 
GitLab