From: Howard Chu Date: Tue, 1 Aug 2017 23:52:13 +0000 (+0100) Subject: ITS#8690 refix X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=a5f3a2885c9d1a72ecebf159522a558a1f33d767;p=openldap ITS#8690 refix Don't double-queue delete ops --- diff --git a/servers/slapd/overlays/syncprov.c b/servers/slapd/overlays/syncprov.c index 27c49a2a3c..bb438db8a4 100644 --- a/servers/slapd/overlays/syncprov.c +++ b/servers/slapd/overlays/syncprov.c @@ -1019,7 +1019,7 @@ syncprov_qstart( syncops *so ) /* Queue a persistent search response */ static int -syncprov_qresp( opcookie *opc, syncops *so, int mode ) +syncprov_qresp( opcookie *opc, syncops *so, int mode, int immed ) { syncres *sr; resinfo *ri; @@ -1074,7 +1074,10 @@ syncprov_qresp( opcookie *opc, syncops *so, int mode ) ri->ri_csn.bv_val = NULL; } } - ri->ri_list = &opc->ssres; + if (immed) + ri->ri_list = NULL; + else + ri->ri_list = &opc->ssres; ri->ri_e = opc->se; ri->ri_csn.bv_len = csn.bv_len; ri->ri_isref = opc->sreference; @@ -1349,13 +1352,13 @@ syncprov_matchops( Operation *op, opcookie *opc, int saveit ) } else { /* if found send UPDATE else send ADD */ syncprov_qresp( opc, ss, - found ? LDAP_SYNC_MODIFY : LDAP_SYNC_ADD ); + found ? LDAP_SYNC_MODIFY : LDAP_SYNC_ADD, 0 ); } } else if ( !saveit && found ) { /* send DELETE */ - syncprov_qresp( opc, ss, LDAP_SYNC_DELETE ); + syncprov_qresp( opc, ss, LDAP_SYNC_DELETE, 0 ); } else if ( !saveit ) { - syncprov_qresp( opc, ss, LDAP_SYNC_NEW_COOKIE ); + syncprov_qresp( opc, ss, LDAP_SYNC_NEW_COOKIE, 0 ); } if ( !saveit && found ) { /* Decrement s_inuse, was incremented when called @@ -1908,7 +1911,7 @@ syncprov_op_response( Operation *op, SlapReply *rs ) * the originating server may be configured to store * their csn values in different entries. */ - syncprov_qresp( opc, ss, LDAP_SYNC_NEW_COOKIE ); + syncprov_qresp( opc, ss, LDAP_SYNC_NEW_COOKIE, 0 ); } ldap_pvt_thread_mutex_unlock( &si->si_ops_mutex ); } @@ -1976,9 +1979,7 @@ syncprov_op_response( Operation *op, SlapReply *rs ) for ( sm = opc->smatches; sm; sm=sm->sm_next ) { if ( sm->sm_op->s_op->o_abandon ) continue; - syncprov_qresp( opc, sm->sm_op, LDAP_SYNC_DELETE ); - if ( opc->ssres.s_info ) - free_resinfo( &opc->ssres ); + syncprov_qresp( opc, sm->sm_op, LDAP_SYNC_DELETE, 1 ); } break; }