* attr_merge - merge the given type and value with the list of
* attributes in attrs.
*
- * For SLAP_NVALUES: nvals must be NULL if the attribute has no
- * normalizer. In this case, a->a_nvals will be set equal to a->a_vals.
+ * nvals must be NULL if the attribute has no normalizer.
+ * In this case, a->a_nvals will be set equal to a->a_vals.
*
* returns 0 everything went ok
* -1 trouble
BerVarray nvals = NULL;
int rc;
- if ( desc->ad_type->sat_equality->smr_normalize ) {
+ if ( desc->ad_type->sat_equality &&
+ desc->ad_type->sat_equality->smr_normalize )
+ {
int i;
- for ( i = 0; vals[i].bv_val; i++);
+ for ( i = 0; vals[i].bv_val; i++ );
- nvals = ch_calloc( sizeof(struct berval), i + 1 );
+ nvals = sl_calloc( sizeof(struct berval), i + 1, memctx );
for ( i = 0; vals[i].bv_val; i++ ) {
rc = (*desc->ad_type->sat_equality->smr_normalize)(
- 0,
+ SLAP_MR_VALUE_OF_ATTRIBUTE_SYNTAX,
desc->ad_type->sat_syntax,
desc->ad_type->sat_equality,
&vals[i], &nvals[i], memctx );
rc = attr_merge( e, desc, vals, nvals );
error_return:;
- ber_bvarray_free( nvals );
+ if ( nvals != NULL ) {
+ ber_bvarray_free_x( nvals, memctx );
+ }
return rc;
}
void *memctx
) {
struct berval nval;
+ struct berval *nvalp;
int rc;
- if ( desc->ad_type->sat_equality->smr_normalize ) {
+ if ( desc->ad_type->sat_equality &&
+ desc->ad_type->sat_equality->smr_normalize )
+ {
rc = (*desc->ad_type->sat_equality->smr_normalize)(
- 0,
+ SLAP_MR_VALUE_OF_ATTRIBUTE_SYNTAX,
desc->ad_type->sat_syntax,
desc->ad_type->sat_equality,
val, &nval, memctx );
if ( rc != LDAP_SUCCESS ) {
return rc;
}
+ nvalp = &nval;
+ } else {
+ nvalp = NULL;
}
- rc = attr_merge_one( e, desc, val, &nval );
- ch_free( nval.bv_val );
+ rc = attr_merge_one( e, desc, val, nvalp );
+ if ( nvalp != NULL ) {
+ sl_free( nval.bv_val, memctx );
+ }
return rc;
}