--- servers/slapd/overlays/syncprov.c 2010/12/12 00:47:22 1.147.2.76 +++ servers/slapd/overlays/syncprov.c 2010/04/29 13:47:27 1.311 @@ -1,4 +1,4 @@ -/* $OpenLDAP$ */ +/* $OpenLDAP: pkg/ldap/servers/slapd/overlays/syncprov.c,v 1.310 2010/04/13 20:18:25 kurt Exp $ */ /* syncprov.c - syncrepl provider */ /* This work is part of OpenLDAP Software . * @@ -783,7 +783,8 @@ syncprov_free_syncop( syncops *so ) 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; } @@ -1301,15 +1302,7 @@ syncprov_matchops( Operation *op, opcook op2.o_hdr = &oh; op2.o_extra = op->o_extra; op2.o_callback = NULL; - ldap_pvt_thread_mutex_lock( &ss->s_mutex ); - if (ss->s_flags & PS_FIX_FILTER) { - /* Skip the AND/GE clause that we stuck on in front. We - would lose deletes/mods that happen during the refresh - phase otherwise (ITS#6555) */ - op2.ors_filter = ss->s_op->ors_filter->f_and->f_next; - } - ldap_pvt_thread_mutex_unlock( &ss->s_mutex ); - rc = test_filter( &op2, e, op2.ors_filter ); + rc = test_filter( &op2, e, ss->s_op->ors_filter ); } Debug( LDAP_DEBUG_TRACE, "syncprov_matchops: sid %03x fscope %d rc %d\n", @@ -2483,9 +2476,8 @@ syncprov_op_search( Operation *op, SlapR if ( newer < 0 ) changed = SS_CHANGED; else if ( newer > 0 ) { - /* our state is older, complain to consumer */ - rs->sr_err = LDAP_UNWILLING_TO_PERFORM; - rs->sr_text = "consumer state is newer than provider!"; + /* our state is older, tell consumer nothing */ + rs->sr_err = LDAP_SUCCESS; bailout: if ( sop ) { syncops **sp = &si->si_ops;