if ( op->o_sync ) {
Operation op2 = *op;
SlapReply rs2 = { 0 };
- Entry e = { 0 };
+ Entry *e = entry_alloc();
slap_callback cb = { 0 };
op2.o_tag = LDAP_REQ_ADD;
op2.o_bd = select_backend( &op->o_bd->be_nsuffix[0], 0, 0 );
- op2.ora_e = &e;
+ op2.ora_e = e;
op2.o_callback = &cb;
- e.e_name = op->o_bd->be_suffix[0];
- e.e_nname = op->o_bd->be_nsuffix[0];
+ ber_dupbv( &e->e_name, op->o_bd->be_suffix );
+ ber_dupbv( &e->e_nname, op->o_bd->be_nsuffix );
cb.sc_response = slap_null_cb;
op2.o_bd->be_add( &op2, &rs2 );
+
+ if ( op2.ora_e == e )
+ entry_free( e );
}
#endif /* BACKSQL_SYNCPROV */
}
op2.o_bd->be_add( &op2, &rs2 );
+ if ( e == op2.ora_e ) entry_free( e );
+ e = NULL;
done:
if ( lo->mask & LOG_OP_WRITES )
memset(cids, 0, sizeof( cids ));
op2.o_bd->be_add( &op2, &rs2 );
- entry_free( e );
+ if ( e == op2.ora_e )
+ entry_free( e );
}
return SLAP_CB_CONTINUE;
}
memset(cids, 0, sizeof( cids ));
op2.o_bd->be_add( &op2, &rs2 );
- entry_free( e );
+ if ( e == op2.ora_e )
+ entry_free( e );
return SLAP_CB_CONTINUE;
}
Entry *e_ctx;
e = entry_alloc();
- e->e_name = *li->li_db->be_suffix;
- e->e_nname = *li->li_db->be_nsuffix;
+ ber_dupbv( &e->e_name, li->li_db->be_suffix );
+ ber_dupbv( &e->e_nname, li->li_db->be_nsuffix );
attr_merge_one( e, slap_schema.si_ad_objectClass,
&log_container->soc_cname, NULL );
SLAP_DBFLAGS( op->o_bd ) |= SLAP_DBFLAG_NOLASTMOD;
rc = op->o_bd->be_add( op, &rs );
SLAP_DBFLAGS( op->o_bd ) ^= SLAP_DBFLAG_NOLASTMOD;
- BER_BVZERO( &e->e_name );
- BER_BVZERO( &e->e_nname );
- entry_free( e );
+ if ( e == op->ora_e )
+ entry_free( e );
}
ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex );
ldap_pvt_runqueue_stoptask( &slapd_rq, rtask );
rc = 0;
}
} else {
- be_entry_release_w( op, e );
+ if ( op->ora_e == e )
+ be_entry_release_w( op, e );
rc = 1;
}
}
if ( op->o_tag == LDAP_REQ_ADD ) {
- op->ora_e = entry_alloc();
+ Entry *e = entry_alloc();
+ op->ora_e = e;
op->ora_e->e_name = op->o_req_dn;
op->ora_e->e_nname = op->o_req_ndn;
freeReqDn = 0;
"syncrepl_message_to_op: rid %03d be_add %s (%d)\n",
si->si_rid, op->o_req_dn.bv_val, rc );
}
- be_entry_release_w( op, op->ora_e );
+ if ( e == op->ora_e )
+ be_entry_release_w( op, op->ora_e );
} else {
op->orm_modlist = modlist;
rc = op->o_bd->be_modify( op, &rs );
si->si_rid, rc, 0 );
switch ( rs_add.sr_err ) {
case LDAP_SUCCESS:
- be_entry_release_w( op, entry );
+ if ( op->ora_e == entry )
+ be_entry_release_w( op, entry );
entry = NULL;
break;
op->ora_e = glue;
rc = be->be_add ( op, &rs_add );
if ( rs_add.sr_err == LDAP_SUCCESS ) {
- be_entry_release_w( op, glue );
+ if ( op->ora_e == glue )
+ be_entry_release_w( op, glue );
} else {
/* incl. ALREADY EXIST */
entry_free( glue );
op->ora_e = e;
rc = be->be_add ( op, &rs_add );
if ( rs_add.sr_err == LDAP_SUCCESS ) {
- be_entry_release_w( op, e );
+ if ( op->ora_e == e )
+ be_entry_release_w( op, e );
} else {
entry_free( e );
}