Fix unprotected checks for psearches

This commit is contained in:
Howard Chu 2007-10-08 13:59:33 +00:00
parent d2f75ebaa5
commit 8bb39495c7

View File

@ -1564,7 +1564,7 @@ syncprov_op_response( Operation *op, SlapReply *rs )
{
struct berval maxcsn = BER_BVNULL;
char cbuf[LDAP_LUTIL_CSNSTR_BUFSIZE];
int do_check = 0;
int do_check = 0, have_psearches;
/* Update our context CSN */
cbuf[0] = '\0';
@ -1623,7 +1623,10 @@ syncprov_op_response( Operation *op, SlapReply *rs )
opc->sctxcsn.bv_val = cbuf;
/* Handle any persistent searches */
if ( si->si_ops ) {
ldap_pvt_thread_mutex_lock( &si->si_ops_mutex );
have_psearches = ( si->si_ops != NULL );
ldap_pvt_thread_mutex_unlock( &si->si_ops_mutex );
if ( have_psearches ) {
switch(op->o_tag) {
case LDAP_REQ_ADD:
case LDAP_REQ_MODIFY:
@ -1726,12 +1729,19 @@ syncprov_op_mod( Operation *op, SlapReply *rs )
{
slap_overinst *on = (slap_overinst *)op->o_bd->bd_info;
syncprov_info_t *si = on->on_bi.bi_private;
slap_callback *cb;
opcookie *opc;
int have_psearches, cbsize;
slap_callback *cb = op->o_tmpcalloc(1, sizeof(slap_callback)+
sizeof(opcookie) +
(si->si_ops ? sizeof(modinst) : 0 ),
op->o_tmpmemctx);
opcookie *opc = (opcookie *)(cb+1);
ldap_pvt_thread_mutex_lock( &si->si_ops_mutex );
have_psearches = ( si->si_ops != NULL );
ldap_pvt_thread_mutex_unlock( &si->si_ops_mutex );
cbsize = sizeof(slap_callback) + sizeof(opcookie) +
(have_psearches ? sizeof(modinst) : 0 );
cb = op->o_tmpcalloc(1, cbsize, op->o_tmpmemctx);
opc = (opcookie *)(cb+1);
opc->son = on;
cb->sc_response = syncprov_op_response;
cb->sc_cleanup = syncprov_op_cleanup;
@ -1742,7 +1752,7 @@ syncprov_op_mod( Operation *op, SlapReply *rs )
/* If there are active persistent searches, lock this operation.
* See seqmod.c for the locking logic on its own.
*/
if ( si->si_ops ) {
if ( have_psearches ) {
modtarget *mt, mtdummy;
modinst *mi;
@ -1789,7 +1799,7 @@ syncprov_op_mod( Operation *op, SlapReply *rs )
}
}
if (( si->si_ops || si->si_logs ) && op->o_tag != LDAP_REQ_ADD )
if (( have_psearches || si->si_logs ) && op->o_tag != LDAP_REQ_ADD )
syncprov_matchops( op, opc, 1 );
return SLAP_CB_CONTINUE;