ber_dupbv_x(
struct berval *dst, struct berval *src, void *ctx )
{
- struct berval *new;
+ struct berval *new, tmp;
if( src == NULL ) {
ber_errno = LBER_ERROR_PARAM;
}
if ( dst ) {
- new = dst;
+ new = &tmp;
} else {
if(( new = ber_memalloc_x( sizeof(struct berval), ctx )) == NULL ) {
return NULL;
if ( src->bv_val == NULL ) {
new->bv_val = NULL;
new->bv_len = 0;
- return new;
- }
+ } else {
- if(( new->bv_val = ber_memalloc_x( src->bv_len + 1, ctx )) == NULL ) {
- if ( !dst )
- ber_memfree_x( new, ctx );
- return NULL;
+ if(( new->bv_val = ber_memalloc_x( src->bv_len + 1, ctx )) == NULL ) {
+ if ( !dst )
+ ber_memfree_x( new, ctx );
+ return NULL;
+ }
+
+ AC_MEMCPY( new->bv_val, src->bv_val, src->bv_len );
+ new->bv_val[src->bv_len] = '\0';
+ new->bv_len = src->bv_len;
}
- AC_MEMCPY( new->bv_val, src->bv_val, src->bv_len );
- new->bv_val[src->bv_len] = '\0';
- new->bv_len = src->bv_len;
+ if ( dst ) {
+ *dst = *new;
+ new = dst;
+ }
return new;
}