GroupAssertion *ga, *gnext;
ldap_pvt_thread_mutex_lock( &so->s_mutex );
- if ( --so->s_inuse > 0 ) {
+ /* already being freed, or still in use */
+ if ( !so->s_inuse || --so->s_inuse > 0 ) {
ldap_pvt_thread_mutex_unlock( &so->s_mutex );
return;
}
}
rs.sr_ctrls = ctrls;
+ rs.sr_entry = &e_uuid;
+ if ( mode == LDAP_SYNC_ADD || mode == LDAP_SYNC_MODIFY ) {
+ e_uuid = *opc->se;
+ e_uuid.e_private = NULL;
+ }
+
switch( mode ) {
case LDAP_SYNC_ADD:
- rs.sr_entry = opc->se;
if ( opc->sreference && so->s_op->o_managedsait <= SLAP_CONTROL_IGNORED ) {
rs.sr_ref = get_entry_referrals( op, rs.sr_entry );
rs.sr_err = send_search_reference( op, &rs );
}
/* fallthru */
case LDAP_SYNC_MODIFY:
- rs.sr_entry = opc->se;
rs.sr_attrs = op->ors_attrs;
rs.sr_err = send_search_entry( op, &rs );
break;
e_uuid.e_attrs = NULL;
e_uuid.e_name = opc->sdn;
e_uuid.e_nname = opc->sndn;
- rs.sr_entry = &e_uuid;
if ( opc->sreference && so->s_op->o_managedsait <= SLAP_CONTROL_IGNORED ) {
struct berval bv = BER_BVNULL;
rs.sr_ref = &bv;
ldap_pvt_thread_mutex_unlock( &so->s_mutex );
if ( sr->s_mode == LDAP_SYNC_NEW_COOKIE ) {
- SlapReply rs = { REP_INTERMEDIATE };
+ SlapReply rs = { REP_INTERMEDIATE };
- rc = syncprov_sendinfo( op, &rs, LDAP_TAG_SYNC_NEW_COOKIE,
+ rc = syncprov_sendinfo( op, &rs, LDAP_TAG_SYNC_NEW_COOKIE,
&sr->s_csn, 0, NULL, 0 );
} else {
opc.sdn = sr->s_dn;
rc = syncprov_sendresp( op, &opc, so, sr->s_mode );
- if ( opc.se ) {
- if ( !dec_mutexint( opc.se->e_private )) {
- opc.se->e_private = NULL;
- entry_free ( opc.se );
- }
+ }
+ if ( sr->s_e ) {
+ if ( !dec_mutexint( sr->s_e->e_private )) {
+ sr->s_e->e_private = NULL;
+ entry_free ( sr->s_e );
}
}
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;
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;
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 );
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 {