From 10ef5cf2fd090506ae9ef4079c422ef7a7fa21ca Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Tue, 24 Jul 2007 06:03:32 +0000 Subject: [PATCH] ITS#5057 from HEAD --- servers/slapd/dn.c | 90 +++++++++++++++++++--------------------------- 1 file changed, 37 insertions(+), 53 deletions(-) diff --git a/servers/slapd/dn.c b/servers/slapd/dn.c index 11551853aa..9143096db4 100644 --- a/servers/slapd/dn.c +++ b/servers/slapd/dn.c @@ -262,81 +262,62 @@ rdnValidate( * Note: the sorting can be slightly improved by sorting first * by attribute type length, then by alphabetical order. * - * uses a linear search; should be fine since the number of AVAs in + * uses an insertion sort; should be fine since the number of AVAs in * a RDN should be limited. */ -static void -AVA_Sort( LDAPRDN rdn, int iAVA ) +static int +AVA_Sort( LDAPRDN rdn, int nAVAs ) { + LDAPAVA *ava_i; int i; - LDAPAVA *ava_in = rdn[ iAVA ]; assert( rdn != NULL ); - assert( ava_in != NULL ); - - for ( i = 0; i < iAVA; i++ ) { - LDAPAVA *ava = rdn[ i ]; - int a, j; - assert( ava != NULL ); + for ( i = 1; i < nAVAs; i++ ) { + LDAPAVA *ava_j; + int j; - a = strcmp( ava_in->la_attr.bv_val, ava->la_attr.bv_val ); + ava_i = rdn[ i ]; + for ( j = i-1; j >=0; j-- ) { + int a; - if ( a > 0 ) { - break; - } + ava_j = rdn[ j ]; + a = strcmp( ava_i->la_attr.bv_val, ava_j->la_attr.bv_val ); - while ( a == 0 ) { - int v, d; + if ( a == 0 ) { + int d; - d = ava_in->la_value.bv_len - ava->la_value.bv_len; + d = ava_i->la_value.bv_len - ava_j->la_value.bv_len; - v = memcmp( ava_in->la_value.bv_val, - ava->la_value.bv_val, - d <= 0 ? ava_in->la_value.bv_len - : ava->la_value.bv_len ); + a = memcmp( ava_i->la_value.bv_val, + ava_j->la_value.bv_val, + d <= 0 ? ava_i->la_value.bv_len + : ava_j->la_value.bv_len ); - if ( v == 0 && d != 0 ) { - v = d; + if ( a == 0 ) { + a = d; + } } + /* Duplicates are not allowed */ + if ( a == 0 ) + return LDAP_INVALID_DN_SYNTAX; - if ( v <= 0 ) { - /* - * got it! - */ + if ( a > 0 ) break; - } - - if ( ++i == iAVA ) { - /* - * already sorted - */ - return; - } - - ava = rdn[ i ]; - a = strcmp( ava_in->la_attr.bv_val, - ava->la_attr.bv_val ); - } - /* - * move ahead - */ - for ( j = iAVA; j > i; j-- ) { - rdn[ j ] = rdn[ j - 1 ]; + rdn[ j+1 ] = rdn[ j ]; } - rdn[ i ] = ava_in; - - return; + rdn[ j+1 ] = ava_i; } + return LDAP_SUCCESS; } static int LDAPRDN_rewrite( LDAPRDN rdn, unsigned flags, void *ctx ) { - int rc; - int iAVA; + int rc, iAVA, do_sort = 0; + for ( iAVA = 0; rdn[ iAVA ]; iAVA++ ) { LDAPAVA *ava = rdn[ iAVA ]; AttributeDescription *ad; @@ -345,7 +326,6 @@ LDAPRDN_rewrite( LDAPRDN rdn, unsigned flags, void *ctx ) slap_syntax_transform_func *transf = NULL; MatchingRule *mr = NULL; struct berval bv = BER_BVNULL; - int do_sort = 0; assert( ava != NULL ); @@ -445,10 +425,14 @@ LDAPRDN_rewrite( LDAPRDN rdn, unsigned flags, void *ctx ) ava->la_value = bv; ava->la_flags |= LDAP_AVA_FREE_VALUE; } + } + rc = LDAP_SUCCESS; - if( do_sort ) AVA_Sort( rdn, iAVA ); + if ( do_sort ) { + rc = AVA_Sort( rdn, iAVA ); } - return LDAP_SUCCESS; + + return rc; } /* -- 2.47.2