- if ( slapi_int_func_internal_pb( pb, op_add ) == 0 ) {
- if ( pb->pop->ora_e != NULL && pb->pop->o_private != NULL ) {
- BackendDB *bd = pb->pop->o_bd;
-
- /* could we use SLAPI_BACKEND instead? */
- pb->pop->o_bd = (BackendDB *)pb->pop->o_private;
- pb->pop->o_private = NULL;
- be_entry_release_w( pb->pop, pb->pop->ora_e );
- pb->pop->ora_e = NULL;
- pb->pop->o_bd = bd;
- pb->pop->o_private = NULL;
+ /* Duplicate the values, because we may call slapi_entry_free() */
+ rs->sr_err = slap_mods2entry( pb->pb_op->ora_modlist, &pb->pb_op->ora_e,
+ 1, 0, &rs->sr_text, pb->pb_textbuf, sizeof( pb->pb_textbuf ) );
+ if ( rs->sr_err != LDAP_SUCCESS ) {
+ goto cleanup;
+ }
+
+ oex.oe.oe_key = (void *)do_add;
+ oex.oe_db = NULL;
+ LDAP_SLIST_INSERT_HEAD(&pb->pb_op->o_extra, &oex.oe, oe_next);
+ rc = slapi_int_func_internal_pb( pb, op_add );
+ LDAP_SLIST_REMOVE(&pb->pb_op->o_extra, &oex.oe, OpExtra, oe_next);
+
+ if ( !rc ) {
+ if ( pb->pb_op->ora_e != NULL && oex.oe_db != NULL ) {
+ BackendDB *bd = pb->pb_op->o_bd;
+
+ pb->pb_op->o_bd = oex.oe_db;
+ be_entry_release_w( pb->pb_op, pb->pb_op->ora_e );
+ pb->pb_op->ora_e = NULL;
+ pb->pb_op->o_bd = bd;