/* 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;
}