From: Quanah Gibson-Mount Date: Thu, 13 Jan 2011 22:56:59 +0000 (+0000) Subject: ITS#6717 X-Git-Tag: OPENLDAP_REL_ENG_2_4_24~70 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=17a35d4bc02a8728696ad1f89a72942e89a4e606;p=openldap ITS#6717 --- diff --git a/CHANGES b/CHANGES index ca680d0658..5e96604c8c 100644 --- a/CHANGES +++ b/CHANGES @@ -105,6 +105,7 @@ OpenLDAP 2.4.24 Engineering Fixed slapo-syncprov sessionlog ordering (ITS#6716) Fixed slapo-syncprov sessionlog with adds (ITS#6503) Fixed slapo-syncprov mutex (ITS#6438) + Fixed slapo-syncprov mincsn check with MMR (ITS#6717) Fixed slapo-translucent entry leak (ITS#6746) Fixed contrib/autogroup LDAP URI with attribute filter (ITS#6536) Fixed contrib/autogroup install location (ITS#6684) diff --git a/servers/slapd/overlays/syncprov.c b/servers/slapd/overlays/syncprov.c index 392656988b..9d99bacf55 100644 --- a/servers/slapd/overlays/syncprov.c +++ b/servers/slapd/overlays/syncprov.c @@ -2415,7 +2415,7 @@ syncprov_op_search( Operation *op, SlapReply *rs ) sync_control *srs; BerVarray ctxcsn; int i, *sids, numcsns; - struct berval mincsn; + struct berval mincsn, maxcsn; int dirty = 0; if ( !(op->o_sync_mode & SLAP_SYNC_REFRESH) ) return SLAP_CB_CONTINUE; @@ -2530,12 +2530,27 @@ syncprov_op_search( Operation *op, SlapReply *rs ) i++; } - /* Find the smallest CSN */ - mincsn = srs->sr_state.ctxcsn[0]; - for ( i=1; isr_state.numcsns; i++ ) { - if ( ber_bvcmp( &mincsn, &srs->sr_state.ctxcsn[i] ) > 0 ) - mincsn = srs->sr_state.ctxcsn[i]; - } + /* Find the smallest CSN which differs from contextCSN */ + mincsn.bv_len = 0; + maxcsn.bv_len = 0; + for ( i=0; isr_state.numcsns; i++ ) { + for ( j=0; jsr_state.sids[i] != sids[j] ) + continue; + if ( BER_BVISEMPTY( &maxcsn ) || ber_bvcmp( &maxcsn, + &srs->sr_state.ctxcsn[i] ) < 0 ) { + maxcsn = srs->sr_state.ctxcsn[i]; + } + if ( ber_bvcmp( &srs->sr_state.ctxcsn[i], &ctxcsn[j] ) < 0) { + if ( BER_BVISEMPTY( &mincsn ) || ber_bvcmp( &mincsn, + &srs->sr_state.ctxcsn[i] ) > 0 ) { + mincsn = srs->sr_state.ctxcsn[i]; + } + } + } + } + if ( BER_BVISEMPTY( &mincsn )) + mincsn = maxcsn; /* If nothing has changed, shortcut it */ if ( srs->sr_state.numcsns == numcsns ) {