mirror of
https://git.openldap.org/openldap/openldap.git
synced 2026-01-19 13:23:44 -05:00
ITS#8360 fix ad info after failed txn
If an add or modify op referenced a previously unused attrtype, the mi_ads/mi_numads would be incremented to include it. If the op fails to commit, these additions must also be reverted.
This commit is contained in:
parent
528b256e09
commit
4001eb054f
3 changed files with 11 additions and 0 deletions
|
|
@ -37,6 +37,7 @@ mdb_add(Operation *op, SlapReply *rs )
|
|||
ID eid, pid = 0;
|
||||
mdb_op_info opinfo = {{{ 0 }}}, *moi = &opinfo;
|
||||
int subentry;
|
||||
int numads = mdb->mi_numads;
|
||||
|
||||
int success;
|
||||
|
||||
|
|
@ -368,6 +369,7 @@ mdb_add(Operation *op, SlapReply *rs )
|
|||
LDAP_SLIST_REMOVE( &op->o_extra, &opinfo.moi_oe, OpExtra, oe_next );
|
||||
opinfo.moi_oe.oe_key = NULL;
|
||||
if ( op->o_noop ) {
|
||||
mdb->mi_numads = numads;
|
||||
mdb_txn_abort( txn );
|
||||
rs->sr_err = LDAP_X_NO_OPERATION;
|
||||
txn = NULL;
|
||||
|
|
@ -377,6 +379,7 @@ mdb_add(Operation *op, SlapReply *rs )
|
|||
rs->sr_err = mdb_txn_commit( txn );
|
||||
txn = NULL;
|
||||
if ( rs->sr_err != 0 ) {
|
||||
mdb->mi_numads = numads;
|
||||
rs->sr_text = "txn_commit failed";
|
||||
Debug( LDAP_DEBUG_ANY,
|
||||
LDAP_XSTRING(mdb_add) ": %s : %s (%d)\n",
|
||||
|
|
@ -400,6 +403,7 @@ return_results:
|
|||
|
||||
if( moi == &opinfo ) {
|
||||
if( txn != NULL ) {
|
||||
mdb->mi_numads = numads;
|
||||
mdb_txn_abort( txn );
|
||||
}
|
||||
if ( opinfo.moi_oe.oe_key ) {
|
||||
|
|
|
|||
|
|
@ -458,6 +458,7 @@ mdb_modify( Operation *op, SlapReply *rs )
|
|||
LDAPControl **postread_ctrl = NULL;
|
||||
LDAPControl *ctrls[SLAP_MAX_RESPONSE_CONTROLS];
|
||||
int num_ctrls = 0;
|
||||
int numads = mdb->mi_numads;
|
||||
|
||||
Debug( LDAP_DEBUG_ARGS, LDAP_XSTRING(mdb_modify) ": %s\n",
|
||||
op->o_req_dn.bv_val, 0, 0 );
|
||||
|
|
@ -635,12 +636,15 @@ mdb_modify( Operation *op, SlapReply *rs )
|
|||
LDAP_SLIST_REMOVE( &op->o_extra, &opinfo.moi_oe, OpExtra, oe_next );
|
||||
opinfo.moi_oe.oe_key = NULL;
|
||||
if( op->o_noop ) {
|
||||
mdb->mi_numads = numads;
|
||||
mdb_txn_abort( txn );
|
||||
rs->sr_err = LDAP_X_NO_OPERATION;
|
||||
txn = NULL;
|
||||
goto return_results;
|
||||
} else {
|
||||
rs->sr_err = mdb_txn_commit( txn );
|
||||
if ( rs->sr_err )
|
||||
mdb->mi_numads = numads;
|
||||
txn = NULL;
|
||||
}
|
||||
}
|
||||
|
|
@ -683,6 +687,7 @@ done:
|
|||
|
||||
if( moi == &opinfo ) {
|
||||
if( txn != NULL ) {
|
||||
mdb->mi_numads = numads;
|
||||
mdb_txn_abort( txn );
|
||||
}
|
||||
if ( opinfo.moi_oe.oe_key ) {
|
||||
|
|
|
|||
|
|
@ -745,6 +745,7 @@ done:
|
|||
mdb_tool_txn = NULL;
|
||||
idcursor = NULL;
|
||||
if( rc != 0 ) {
|
||||
mdb->mi_numads = 0;
|
||||
snprintf( text->bv_val, text->bv_len,
|
||||
"txn_commit failed: %s (%d)",
|
||||
mdb_strerror(rc), rc );
|
||||
|
|
@ -1015,6 +1016,7 @@ done:
|
|||
if( rc == 0 ) {
|
||||
rc = mdb_txn_commit( mdb_tool_txn );
|
||||
if( rc != 0 ) {
|
||||
mdb->mi_numads = 0;
|
||||
snprintf( text->bv_val, text->bv_len,
|
||||
"txn_commit failed: %s (%d)",
|
||||
mdb_strerror(rc), rc );
|
||||
|
|
|
|||
Loading…
Reference in a new issue