#include <ac/time.h>
#include <ac/socket.h>
-#include "ldap_pvt.h"
#include "slap.h"
#ifdef LDAP_SLAPI
goto done;
}
- Statslog( LDAP_DEBUG_STATS, "conn=%lu op=%lu ADD dn=\"%s\"\n",
- op->o_connid, op->o_opid, e->e_name.bv_val, 0, 0 );
+ Statslog( LDAP_DEBUG_STATS, "%s ADD dn=\"%s\"\n",
+ op->o_log_prefix, e->e_name.bv_val, 0, 0, 0 );
if( e->e_nname.bv_len == 0 ) {
/* protocolError may be a more appropriate error */
* appropriate one, or send a referral to our "referral server"
* if we don't hold it.
*/
- op->o_bd = select_backend( &e->e_nname, manageDSAit, 0 );
+ op->o_bd = select_backend( &e->e_nname, manageDSAit, 1 );
if ( op->o_bd == NULL ) {
rs->sr_ref = referral_rewrite( default_referral,
NULL, &e->e_name, LDAP_SCOPE_DEFAULT );
assert( (*modtail)->sml_desc != NULL );
}
rs->sr_err = slap_mods_opattrs( op, modlist, modtail,
- &rs->sr_text, textbuf, textlen );
+ &rs->sr_text, textbuf, textlen, 1 );
if( rs->sr_err != LDAP_SUCCESS ) {
send_ldap_result( op, rs );
goto done;
be_entry_release_w( op, e );
e = NULL;
}
+ op->ora_e = NULL;
#ifndef SLAPD_MULTIMASTER
} else {
/* should check for duplicates */
- AC_MEMCPY( &attr->a_vals[i], mods->sml_values,
- sizeof( struct berval ) * j );
-
- /* trim the mods array */
- ch_free( mods->sml_values );
- mods->sml_values = NULL;
+ if ( dup ) {
+ for ( j = 0; mods->sml_values[j].bv_val; j++ ) {
+ ber_dupbv( &attr->a_vals[i+j], &mods->sml_values[j] );
+ }
+ BER_BVZERO( &attr->a_vals[i+j] );
+ } else {
+ AC_MEMCPY( &attr->a_vals[i], mods->sml_values,
+ sizeof( struct berval ) * j );
+ ch_free( mods->sml_values );
+ mods->sml_values = NULL;
+ }
if( mods->sml_nvalues ) {
attr->a_nvals = ch_realloc( attr->a_nvals,
sizeof( struct berval ) * (i+j) );
-
- AC_MEMCPY( &attr->a_nvals[i], mods->sml_nvalues,
- sizeof( struct berval ) * j );
-
- /* trim the mods array */
- ch_free( mods->sml_nvalues );
- mods->sml_nvalues = NULL;
-
+ if ( dup ) {
+ for ( j = 0; mods->sml_nvalues[j].bv_val; j++ ) {
+ ber_dupbv( &attr->a_nvals[i+j], &mods->sml_nvalues[j] );
+ }
+ BER_BVZERO( &attr->a_nvals[i+j] );
+ } else {
+ AC_MEMCPY( &attr->a_nvals[i], mods->sml_nvalues,
+ sizeof( struct berval ) * j );
+ ch_free( mods->sml_nvalues );
+ mods->sml_nvalues = NULL;
+ }
} else {
attr->a_nvals = attr->a_vals;
}