From: Jong Hyuk Choi Date: Fri, 24 Sep 2004 08:19:50 +0000 (+0000) Subject: rework of slap_mods2entry dup X-Git-Tag: OPENLDAP_REL_ENG_2_3_0ALPHA~507 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=dda85fafe90e70db53d129fab0a79d0d5319f8d2;p=openldap rework of slap_mods2entry dup --- diff --git a/servers/slapd/add.c b/servers/slapd/add.c index d4f6b6b914..086efa4ba7 100644 --- a/servers/slapd/add.c +++ b/servers/slapd/add.c @@ -422,24 +422,32 @@ slap_mods2entry( /* 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; }