From: Howard Chu Date: Fri, 27 Feb 2009 01:11:33 +0000 (+0000) Subject: ITS#5977 strip duplicates out of sorted attrs X-Git-Tag: ACLCHECK_0~781 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=62eeafa1d96ca9b05fb29406bba2106029c7c754;p=openldap ITS#5977 strip duplicates out of sorted attrs --- diff --git a/servers/slapd/back-ldap/search.c b/servers/slapd/back-ldap/search.c index 389278cb11..8f49187c50 100644 --- a/servers/slapd/back-ldap/search.c +++ b/servers/slapd/back-ldap/search.c @@ -732,6 +732,10 @@ ldap_build_entry( for ( i = 0; !BER_BVISNULL( &attr->a_vals[i] ); i++ ) ; last = i; + /* + * check that each value is valid per syntax + * and pretty if appropriate + */ for ( i = 0; ia_desc->ad_type->sat_equality->smr_normalize( SLAP_MR_VALUE_OF_ATTRIBUTE_SYNTAX, attr->a_desc->ad_type->sat_syntax, @@ -814,6 +814,30 @@ ldap_build_entry( } attr->a_numvals = last; + + /* Handle sorted vals, strip dups but keep the attr */ + if ( attr->a_desc->ad_type->sat_flags & SLAP_AT_SORTED_VAL ) { + while ( attr->a_numvals > 1 ) { + int rc = slap_sort_vals( (Modifications *)attr, &text, &i, op->o_tmpmemctx ); + if ( rc != LDAP_TYPE_OR_VALUE_EXISTS ) + break; + + /* Strip duplicate values */ + if ( attr->a_nvals != attr->a_vals ) + LBER_FREE( attr->a_nvals[i].bv_val ); + LBER_FREE( attr->a_vals[i].bv_val ); + attr->a_numvals--; + if ( i < attr->a_numvals ) { + attr->a_vals[i] = attr->a_vals[attr->a_numvals]; + if ( attr->a_nvals != attr->a_vals ) + attr->a_nvals[i] = attr->a_nvals[attr->a_numvals]; + } + BER_BVZERO(&attr->a_vals[attr->a_numvals]); + if ( attr->a_nvals != attr->a_vals ) + BER_BVZERO(&attr->a_vals[attr->a_numvals]); + } + } + *attrp = attr; attrp = &attr->a_next;