Fixed slapd runqueue use of freed memory (ITS#4517)
Fixed slapd slap_send_ldap_result bug (ITS#4499)
Fixed slapd thread pool init issue (ITS#4513)
- Fixed slapd-bdb pre/post-read freeing (ITS#4532)
Added slapd syncrepl mandatory searchbase check
+ Fixed slapd-bdb pre/post-read freeing (ITS#4532)
+ Fixed slapd-bdb pre/post-read unavailable issue (ITS#4538)
Fixed slapadd cn=config issue (ITS#4194)
Fixed slapd-ldap proxyAuthz of bound identity/override (ITS#4497)
Fixed slapd-ldap/meta protocol version propagation (ITS#4488)
Fixed slapo-accesslog log purging issue (ITS#4505)
Added slapo-accesslog reqOld feature
Fixed slapo-auditlog missing return codes
- Fixed slapo-ppolicy BER tags (ITS#4528)
+ Fixed slapo-ppolicy BER tags issue (ITS#4528)
+ Fixed slapo-refinit delete prohibit issue (ITS#4442)
Fixed slapo-syncprov MODs cause DELs (ITS#4423)
+ Fixed slapo-syncprov/syncrepl sessionlog issue (ITS#4534)
Fixed slapo-translucent modifications (ITS#4527)
Fixed slurpd potential overflow issue
+ Build Environment
+ Fixed test020-proxycache disabled debug issue (ITS#4491)
OpenLDAP 2.3.21 Release
Fixed libldap referral chasing issue (ITS#4448)
for(ip = id->attrs, ac = 0; ip; ip = ip->next, ac++);
if(!ac) {
- rs->sr_err = LDAP_OTHER;
- rs->sr_text = "refint_response called without any attributes";
+ Debug( LDAP_DEBUG_TRACE,
+ "refint_response called without any attributes\n", 0, 0, 0 );
return SLAP_CB_CONTINUE;
}
if(nop.o_bd) {
if (!nop.o_bd->be_search || !nop.o_bd->be_modify) {
- rs->sr_err = LDAP_UNWILLING_TO_PERFORM;
- rs->sr_text = "backend missing search and/or modify";
+ Debug( LDAP_DEBUG_TRACE,
+ "refint_response: backend missing search and/or modify\n",
+ 0, 0, 0 );
return SLAP_CB_CONTINUE;
}
} else {
- rs->sr_err = LDAP_OTHER;
- rs->sr_text = "no known backend? this shouldn't be happening!";
+ Debug( LDAP_DEBUG_TRACE,
+ "refint_response: no backend for our baseDN %s??\n",
+ id->dn.bv_val, 0, 0 );
return SLAP_CB_CONTINUE;
}
dd.nnewdn.bv_val = NULL;
if(rc != LDAP_SUCCESS) {
- rs->sr_err = nrs.sr_err;
- rs->sr_text = "refint_response search failed";
+ Debug( LDAP_DEBUG_TRACE,
+ "refint_response: search failed: %d\n",
+ rc, 0, 0 );
goto done;
}
/* safety? paranoid just in case */
if(!cb.sc_private) {
- rs->sr_err = LDAP_OTHER;
- rs->sr_text = "whoa! refint_response callback wiped out sc_private?!";
+ Debug( LDAP_DEBUG_TRACE,
+ "refint_response: callback wiped out sc_private?!\n",
+ 0, 0, 0 );
goto done;
}
nop.o_req_ndn = dp->dn;
nop.o_bd = select_backend(&dp->dn, 0, 1);
if(!nop.o_bd) {
- rs->sr_err = LDAP_OTHER;
- rs->sr_text = "this should never happen either!";
+ Debug( LDAP_DEBUG_TRACE,
+ "refint_response: no backend for DN %s!\n",
+ dp->dn.bv_val, 0, 0 );
goto done;
}
nrs.sr_type = REP_RESULT;
nop.o_ndn = nop.o_bd->be_rootndn;
if(rs->sr_err != LDAP_SUCCESS) goto done;
if((rc = nop.o_bd->be_modify(&nop, &nrs)) != LDAP_SUCCESS) {
- rs->sr_err = nrs.sr_err;
- rs->sr_text = "dependent modify failed";
+ Debug( LDAP_DEBUG_TRACE,
+ "refint_response: dependent modify failed: %d\n",
+ nrs.sr_err, 0, 0 );
goto done;
}
}
/* enter with sl->sl_mutex locked, release before returning */
static void
syncprov_playlog( Operation *op, SlapReply *rs, sessionlog *sl,
- struct berval *oldcsn, struct berval *ctxcsn )
+ sync_control *srs, struct berval *ctxcsn )
{
slap_overinst *on = (slap_overinst *)op->o_bd->bd_info;
slog_entry *se;
int i, j, ndel, num, nmods, mmods;
+ char cbuf[LDAP_LUTIL_CSNSTR_BUFSIZE];
BerVarray uuids;
+ struct berval delcsn;
if ( !sl->sl_num ) {
ldap_pvt_thread_mutex_unlock( &sl->sl_mutex );
uuids = op->o_tmpalloc( (num+1) * sizeof( struct berval ) +
num * UUID_LEN, op->o_tmpmemctx );
-
uuids[0].bv_val = (char *)(uuids + num + 1);
+ delcsn.bv_len = 0;
+ delcsn.bv_val = cbuf;
+
/* Make a copy of the relevant UUIDs. Put the Deletes up front
* and everything else at the end. Do this first so we can
* unlock the list mutex.
*/
for ( se=sl->sl_head; se; se=se->se_next ) {
- if ( ber_bvcmp( &se->se_csn, oldcsn ) <= 0 ) continue;
+ if ( ber_bvcmp( &se->se_csn, &srs->sr_state.ctxcsn ) <= 0 ) continue;
if ( ber_bvcmp( &se->se_csn, ctxcsn ) > 0 ) break;
if ( se->se_tag == LDAP_REQ_DELETE ) {
j = i;
i++;
+ AC_MEMCPY( cbuf, se->se_csn.bv_val, se->se_csn.bv_len );
+ delcsn.bv_len = se->se_csn.bv_len;
} else {
nmods++;
j = num - nmods;
fop.o_bd->bd_info = (BackendInfo *)on;
}
if ( ndel ) {
+ struct berval cookie;
+
+ slap_compose_sync_cookie( op, &cookie, &delcsn, srs->sr_state.rid );
uuids[ndel].bv_val = NULL;
- syncprov_sendinfo( op, rs, LDAP_TAG_SYNC_ID_SET, NULL, 0, uuids, 1 );
+ syncprov_sendinfo( op, rs, LDAP_TAG_SYNC_ID_SET, &cookie, 0, uuids, 1 );
+ op->o_tmpfree( cookie.bv_val, op->o_tmpmemctx );
}
+ op->o_tmpfree( uuids, op->o_tmpmemctx );
}
static int
if ( ber_bvcmp( &srs->sr_state.ctxcsn, &sl->sl_mincsn ) >= 0 ) {
do_present = 0;
/* mutex is unlocked in playlog */
- syncprov_playlog( op, rs, sl, &srs->sr_state.ctxcsn, &ctxcsn );
+ syncprov_playlog( op, rs, sl, srs, &ctxcsn );
} else {
ldap_pvt_thread_mutex_unlock( &sl->sl_mutex );
}
static int syncuuid_cmp( const void *, const void * );
static void avl_ber_bvfree( void * );
-static void syncrepl_del_nonpresent( Operation *, syncinfo_t *, BerVarray );
+static void syncrepl_del_nonpresent( Operation *, syncinfo_t *, BerVarray, struct berval * );
static int syncrepl_message_to_op(
syncinfo_t *, Operation *, LDAPMessage * );
static int syncrepl_message_to_entry(
if ( refreshDeletes == 0 && match < 0 &&
err == LDAP_SUCCESS )
{
- syncrepl_del_nonpresent( op, si, NULL );
+ syncrepl_del_nonpresent( op, si, NULL, NULL );
} else {
avl_free( si->si_presentlist, avl_ber_bvfree );
si->si_presentlist = NULL;
ber_scanf( ber, "[W]", &syncUUIDs );
ber_scanf( ber, /*"{"*/ "}" );
if ( refreshDeletes ) {
- syncrepl_del_nonpresent( op, si, syncUUIDs );
+ syncrepl_del_nonpresent( op, si, syncUUIDs,
+ &syncCookie.ctxcsn );
ber_bvarray_free_x( syncUUIDs, op->o_tmpmemctx );
} else {
for ( i = 0; !BER_BVISNULL( &syncUUIDs[i] ); i++ ) {
if ( si->si_refreshPresent == 1 ) {
if ( match < 0 ) {
- syncrepl_del_nonpresent( op, si, NULL );
+ syncrepl_del_nonpresent( op, si, NULL, NULL );
}
}
syncrepl_del_nonpresent(
Operation *op,
syncinfo_t *si,
- BerVarray uuids )
+ BerVarray uuids,
+ struct berval *cookiecsn )
{
Backend* be = op->o_bd;
slap_callback cb = { NULL };
AttributeName an[2];
struct berval pdn = BER_BVNULL;
+ struct berval csn;
op->o_req_dn = si->si_base;
op->o_req_ndn = si->si_base;
if ( !LDAP_LIST_EMPTY( &si->si_nonpresentlist ) ) {
- slap_queue_csn( op, &si->si_syncCookie.ctxcsn );
+ if ( cookiecsn && !BER_BVISNULL( cookiecsn ))
+ csn = *cookiecsn;
+ else
+ csn = si->si_syncCookie.ctxcsn;
+
+ slap_queue_csn( op, &csn );
np_list = LDAP_LIST_FIRST( &si->si_nonpresentlist );
while ( np_list != NULL ) {
exit $RC
fi
+# ITS#4491, if debug messages are unavailable, we can't verify the tests.
+grep "query template" $LOG2 > /dev/null
+RC=$?
+if test $RC != 0 ; then
+ echo "Debug messages unavailable, test aborted..."
+ test $KILLSERVERS != no && kill -HUP $KILLPIDS && wait
+ exit 0
+fi
+
echo "Query 2: filter:(|(cn=*Jon*)(sn=Jon*)) attrs:cn sn title uid"
echo "# Query 2: filter:(|(cn=*Jon*)(sn=Jon*)) attrs:cn sn title uid" >> $SLAVEOUT
$LDAPSEARCH -x -S "" -b "$BASEDN" -h $LOCALHOST -p $PORT2 \