X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fvalue.c;h=c3c0b0d47257a1044244ad77e05cc5d6e448ed9e;hb=2c94c7915a52f8df4323c8193ec424df568f0fc1;hp=c73807cebfd886f867e06c713f70765b974c412c;hpb=aee36002767937f0dfe7382270979f0827fcf072;p=openldap diff --git a/servers/slapd/value.c b/servers/slapd/value.c index c73807cebf..c3c0b0d472 100644 --- a/servers/slapd/value.c +++ b/servers/slapd/value.c @@ -1,7 +1,7 @@ /* value.c - routines for dealing with values */ /* $OpenLDAP$ */ /* - * Copyright 1998-2000 The OpenLDAP Foundation, All Rights Reserved. + * Copyright 1998-2002 The OpenLDAP Foundation, All Rights Reserved. * COPYING RESTRICTIONS APPLY, see COPYRIGHT file */ @@ -20,33 +20,35 @@ int value_add( - struct berval ***vals, - struct berval **addvals + BerVarray *vals, + BerVarray addvals ) { - int n, nn, i, j; + int n, nn; + BerVarray v2; - for ( nn = 0; addvals != NULL && addvals[nn] != NULL; nn++ ) + for ( nn = 0; addvals != NULL && addvals[nn].bv_val != NULL; nn++ ) ; /* NULL */ if ( *vals == NULL ) { - *vals = (struct berval **) ch_malloc( (nn + 1) - * sizeof(struct berval *) ); + *vals = (BerVarray) ch_malloc( (nn + 1) + * sizeof(struct berval) ); n = 0; } else { - for ( n = 0; (*vals)[n] != NULL; n++ ) - ; /* NULL */ - *vals = (struct berval **) ch_realloc( (char *) *vals, - (n + nn + 1) * sizeof(struct berval *) ); + for ( n = 0; (*vals)[n].bv_val != NULL; n++ ) { + ; /* Empty */ + } + *vals = (BerVarray) ch_realloc( (char *) *vals, + (n + nn + 1) * sizeof(struct berval) ); } - for ( i = 0, j = 0; i < nn; i++ ) { - if ( addvals[i]->bv_len > 0 ) { - (*vals)[n + j] = ber_bvdup( addvals[i] ); - if( (*vals)[n + j++] == NULL ) break; - } + v2 = *vals + n; + for ( ; addvals->bv_val; v2++, addvals++ ) { + ber_dupbv(v2, addvals); + if (v2->bv_val == NULL) break; } - (*vals)[n + j] = NULL; + v2->bv_val = NULL; + v2->bv_len = 0; return LDAP_SUCCESS; } @@ -57,7 +59,7 @@ value_normalize( AttributeDescription *ad, unsigned usage, struct berval *in, - struct berval **out, + struct berval *out, const char **text ) { int rc; @@ -114,7 +116,7 @@ value_normalize( } } else { - *out = ber_bvdup( in ); + ber_dupbv( out, in ); } return LDAP_SUCCESS; @@ -132,8 +134,8 @@ value_match( const char ** text ) { int rc; - struct berval *nv1 = NULL; - struct berval *nv2 = NULL; + struct berval nv1 = { 0, NULL }; + struct berval nv2 = { 0, NULL }; if( !mr->smr_match ) { return LDAP_INAPPROPRIATE_MATCHING; @@ -148,22 +150,26 @@ value_match( } } - if ( !(flags & SLAP_MR_VALUE_IS_IN_MR_SYNTAX) && - mr->smr_convert ) { - rc = (mr->smr_convert)(v2,&nv2); + if ( SLAP_IS_MR_VALUE_SYNTAX_NONCONVERTED_MATCH( flags ) && + mr->smr_convert ) + { + rc = (mr->smr_convert)( v2, &nv2 ); if ( rc != LDAP_SUCCESS ) { - return LDAP_INVALID_SYNTAX; + return LDAP_INVALID_SYNTAX; } + + /* let smr_match know we've converted the value */ + flags |= SLAP_MR_VALUE_SYNTAX_CONVERTED_MATCH; } rc = (mr->smr_match)( match, flags, ad->ad_type->sat_syntax, mr, - nv1 != NULL ? nv1 : v1, - nv2 != NULL ? nv2 : v2 ); + nv1.bv_val != NULL ? &nv1 : v1, + nv2.bv_val != NULL ? &nv2 : v2 ); - ber_bvfree( nv1 ); - ber_bvfree( nv2 ); + if (nv1.bv_val ) free( nv1.bv_val ); + if (nv2.bv_val ) free( nv2.bv_val ); return rc; } @@ -171,13 +177,13 @@ value_match( int value_find_ex( AttributeDescription *ad, unsigned flags, - struct berval **vals, + BerVarray vals, struct berval *val ) { int i; int rc; - struct berval *nval = NULL; - struct berval *nval_tmp = NULL; + struct berval nval = { 0, NULL }; + struct berval nval_tmp; MatchingRule *mr = ad->ad_type->sat_equality; if( mr == NULL || !mr->smr_match ) { @@ -185,41 +191,43 @@ int value_find_ex( } /* Take care of this here or ssyn_normalize later will hurt */ - if ( !(flags & SLAP_MR_VALUE_IS_IN_MR_SYNTAX) && - mr->smr_convert ) { - rc = (mr->smr_convert)(val,&nval); + if ( SLAP_IS_MR_VALUE_SYNTAX_NONCONVERTED_MATCH( flags ) + && mr->smr_convert ) + { + rc = (mr->smr_convert)( val, &nval ); if ( rc != LDAP_SUCCESS ) { return LDAP_INVALID_SYNTAX; } + + /* let value_match know we've done the version */ + flags |= SLAP_MR_VALUE_SYNTAX_CONVERTED_MATCH; } if( mr->smr_syntax->ssyn_normalize ) { rc = mr->smr_syntax->ssyn_normalize( - mr->smr_syntax, nval == NULL ? val : nval, &nval_tmp ); + mr->smr_syntax, nval.bv_val == NULL ? val : &nval, &nval_tmp ); - ber_bvfree(nval); + free(nval.bv_val); nval = nval_tmp; if( rc != LDAP_SUCCESS ) { - ber_bvfree(nval); + free(nval.bv_val); return LDAP_INAPPROPRIATE_MATCHING; } } - for ( i = 0; vals[i] != NULL; i++ ) { + for ( i = 0; vals[i].bv_val != NULL; i++ ) { int match; const char *text; - /* We did convert, so keep value_match from trying */ - rc = value_match( &match, ad, mr, - flags & !SLAP_MR_VALUE_IS_IN_MR_SYNTAX, - vals[i], nval == NULL ? val : nval, &text ); + rc = value_match( &match, ad, mr, flags, + &vals[i], nval.bv_val == NULL ? val : &nval, &text ); if( rc == LDAP_SUCCESS && match == 0 ) { - ber_bvfree( nval ); + free( nval.bv_val ); return LDAP_SUCCESS; } } - ber_bvfree( nval ); + free( nval.bv_val ); return LDAP_NO_SUCH_ATTRIBUTE; }