From 86ef29b5e79645f1e2fc98f429035db7b433a90a Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Mon, 14 Mar 2005 00:12:48 +0000 Subject: [PATCH] ITS#3596 partial fix - allow abandoning a locked operation --- servers/slapd/overlays/syncprov.c | 12 ++++++++++++ servers/slapd/passwd.c | 21 +++++++++++---------- 2 files changed, 23 insertions(+), 10 deletions(-) diff --git a/servers/slapd/overlays/syncprov.c b/servers/slapd/overlays/syncprov.c index 84b6523d6f..c406f5b1fa 100644 --- a/servers/slapd/overlays/syncprov.c +++ b/servers/slapd/overlays/syncprov.c @@ -1487,6 +1487,18 @@ syncprov_op_mod( Operation *op, SlapReply *rs ) ldap_pvt_thread_mutex_unlock( &mt->mt_mutex ); ldap_pvt_thread_yield(); ldap_pvt_thread_mutex_lock( &mt->mt_mutex ); + + /* clean up if the caller is giving up */ + if ( op->o_abandon ) { + modinst *m2; + for ( m2 = mt->mt_mods; m2->mi_next != mi; + m2 = m2->mi_next ); + m2->mi_next = mi->mi_next; + if ( mt->mt_tail == mi ) mt->mt_tail = m2; + op->o_tmpfree( cb, op->o_tmpmemctx ); + ldap_pvt_thread_mutex_unlock( &mt->mt_mutex ); + return SLAPD_ABANDON; + } } ldap_pvt_thread_mutex_unlock( &mt->mt_mutex ); } else { diff --git a/servers/slapd/passwd.c b/servers/slapd/passwd.c index b44408b4a8..e056a83604 100644 --- a/servers/slapd/passwd.c +++ b/servers/slapd/passwd.c @@ -44,8 +44,8 @@ int passwd_extop( { struct berval id = {0, NULL}, hash, *rsp = NULL; req_pwdexop_s *qpw = &op->oq_pwdexop; + req_extended_s qext = op->oq_extended; Modifications *ml; - Operation op2; slap_callback cb = { NULL, slap_null_cb, NULL, NULL }; slap_callback cb2 = { NULL, slap_replog_cb, NULL, NULL }; int i, nhash; @@ -208,27 +208,27 @@ int passwd_extop( rs->sr_err = LDAP_OTHER; } else { - op2 = *op; - op2.o_tag = LDAP_REQ_MODIFY; - op2.o_callback = &cb2; - op2.orm_modlist = qpw->rs_mods; + slap_callback *sc = op->o_callback; + + op->o_tag = LDAP_REQ_MODIFY; + op->o_callback = &cb2; + op->orm_modlist = qpw->rs_mods; cb2.sc_private = qpw; /* let Modify know this was pwdMod, * if it cares... */ - rs->sr_err = slap_mods_opattrs( &op2, ml, qpw->rs_modtail, &rs->sr_text, + rs->sr_err = slap_mods_opattrs( op, ml, qpw->rs_modtail, &rs->sr_text, NULL, 0, 1 ); if ( rs->sr_err == LDAP_SUCCESS ) { - rs->sr_err = op2.o_bd->be_modify( &op2, rs ); - /* FIXME: in case it got rewritten... */ - op->o_req_dn = op2.o_req_dn; - op->o_req_ndn = op2.o_req_ndn; + rs->sr_err = op->o_bd->be_modify( op, rs ); } if ( rs->sr_err == LDAP_SUCCESS ) { rs->sr_rspdata = rsp; } else if ( rsp ) { ber_bvfree( rsp ); } + op->o_tag = LDAP_REQ_EXTENDED; + op->o_callback = sc; } slap_mods_free( qpw->rs_mods ); if ( rsp ) { @@ -236,6 +236,7 @@ int passwd_extop( } rc = rs->sr_err; + op->oq_extended = qext; error_return:; if ( !BER_BVISNULL( &op->o_req_dn ) ) { -- 2.39.5