Fixed libldap peer cert double free (ITS#5849)
Fixed libldap referral chasing (ITS#5980)
Fixed slapd backglue with empty DBs (ITS#5986)
+ Fixed slapd ctxcsn race condition (ITS#6001)
Fixed slapd syncrepl newCookie sync messages (ITS#5972)
Fixed slapd syncrepl multiple CSN propagation (ITS#5973)
Fixed slapd-bdb/hdb cachesize handling (ITS#5860)
{
struct slap_csn_entry *csne, *committed_csne = NULL;
BackendDB *be = op->o_bd->bd_self;
+ int sid = -1;
if ( maxcsn ) {
assert( maxcsn->bv_val != NULL );
ldap_pvt_thread_mutex_lock( &be->be_pcl_mutex );
+ if ( !BER_BVISEMPTY( &op->o_csn )) {
+ sid = slap_parse_csn_sid( &op->o_csn );
+ }
+
LDAP_TAILQ_FOREACH( csne, be->be_pending_csn_list, ce_csn_link ) {
if ( csne->ce_opid == op->o_opid && csne->ce_connid == op->o_connid ) {
csne->ce_state = SLAP_CSN_COMMIT;
}
LDAP_TAILQ_FOREACH( csne, be->be_pending_csn_list, ce_csn_link ) {
- if ( csne->ce_state == SLAP_CSN_COMMIT ) committed_csne = csne;
- if ( csne->ce_state == SLAP_CSN_PENDING ) break;
+ if ( sid != -1 && sid == csne->ce_sid ) {
+ if ( csne->ce_state == SLAP_CSN_COMMIT ) committed_csne = csne;
+ if ( csne->ce_state == SLAP_CSN_PENDING ) break;
+ }
}
if ( maxcsn ) {
ber_dupbv( &pending->ce_csn, csn );
ber_bvreplace_x( &op->o_csn, &pending->ce_csn, op->o_tmpmemctx );
+ pending->ce_sid = slap_parse_csn_sid( csn );
pending->ce_connid = op->o_connid;
pending->ce_opid = op->o_opid;
pending->ce_state = SLAP_CSN_PENDING;