From: Howard Chu Date: Wed, 16 Apr 2008 10:37:44 +0000 (+0000) Subject: ITS#5470 don't return any data at all until we have a ctxcsn X-Git-Tag: OPENLDAP_REL_ENG_2_4_9~20^2~14 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=2abce972281d98a6026515e56e250af9d3e27552;p=openldap ITS#5470 don't return any data at all until we have a ctxcsn --- diff --git a/servers/slapd/overlays/syncprov.c b/servers/slapd/overlays/syncprov.c index 9d7a9ad721..92c7e6a01f 100644 --- a/servers/slapd/overlays/syncprov.c +++ b/servers/slapd/overlays/syncprov.c @@ -2117,6 +2117,27 @@ syncprov_op_search( Operation *op, SlapReply *rs ) srs = op->o_controls[slap_cids.sc_LDAPsync]; op->o_managedsait = SLAP_CONTROL_NONCRITICAL; + /* snapshot the ctxcsn */ + ldap_pvt_thread_rdwr_rlock( &si->si_csn_rwlock ); + numcsns = si->si_numcsns; + if ( numcsns ) { + ber_bvarray_dup_x( &ctxcsn, si->si_ctxcsn, op->o_tmpmemctx ); + sids = op->o_tmpalloc( numcsns * sizeof(int), op->o_tmpmemctx ); + for ( i=0; isi_sids[i]; + } else { + ctxcsn = NULL; + sids = NULL; + } + ldap_pvt_thread_rdwr_runlock( &si->si_csn_rwlock ); + + /* If we have no ctxcsn yet, don't return any data at all. */ + if ( !numcsns ) { + rs->sr_err = LDAP_SUCCESS; + send_ldap_result( op, rs ); + return rs->sr_err; + } + /* If this is a persistent search, set it up right away */ if ( op->o_sync_mode & SLAP_SYNC_PERSIST ) { syncops so = {0}; @@ -2156,31 +2177,11 @@ syncprov_op_search( Operation *op, SlapReply *rs ) ldap_pvt_thread_mutex_unlock( &si->si_ops_mutex ); } - /* snapshot the ctxcsn */ - ldap_pvt_thread_rdwr_rlock( &si->si_csn_rwlock ); - numcsns = si->si_numcsns; - if ( numcsns ) { - ber_bvarray_dup_x( &ctxcsn, si->si_ctxcsn, op->o_tmpmemctx ); - sids = op->o_tmpalloc( numcsns * sizeof(int), op->o_tmpmemctx ); - for ( i=0; isi_sids[i]; - } else { - ctxcsn = NULL; - sids = NULL; - } - ldap_pvt_thread_rdwr_runlock( &si->si_csn_rwlock ); - /* If we have a cookie, handle the PRESENT lookups */ if ( srs->sr_state.ctxcsn ) { sessionlog *sl; int i, j; - /* If we don't have any CSN of our own yet, pretend nothing - * has changed. - */ - if ( !numcsns ) - goto no_change; - if ( !si->si_nopres ) do_present = SS_PRESENT; @@ -2228,7 +2229,7 @@ syncprov_op_search( Operation *op, SlapReply *rs ) } if ( !changed ) { do_present = 0; -no_change: if ( !(op->o_sync_mode & SLAP_SYNC_PERSIST) ) { + if ( !(op->o_sync_mode & SLAP_SYNC_PERSIST) ) { LDAPControl *ctrls[2]; ctrls[0] = NULL;