X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fvalue.c;h=c3c0b0d47257a1044244ad77e05cc5d6e448ed9e;hb=2c94c7915a52f8df4323c8193ec424df568f0fc1;hp=21ec4e067e39df46b91ddbb7fd13ac49ec8e1029;hpb=bd243c07a38bb5ee97d1704d23e48d988ce3914a;p=openldap diff --git a/servers/slapd/value.c b/servers/slapd/value.c index 21ec4e067e..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,80 +20,46 @@ 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 ( 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; + for ( n = 0; (*vals)[n].bv_val != NULL; n++ ) { + ; /* Empty */ } - } - (*vals)[n + j] = NULL; - - return( 0 ); -} - -#ifdef SLAPD_SCHEMA_NOT_COMPAT - /* not used */ -#else -int -value_add_fast( - struct berval ***vals, - struct berval **addvals, - int nvals, - int naddvals, - int *maxvals -) -{ - int need, i, j; - - if ( *maxvals == 0 ) { - *maxvals = 1; - } - need = nvals + naddvals + 1; - while ( *maxvals < need ) { - *maxvals *= 2; - *vals = (struct berval **) ch_realloc( (char *) *vals, - *maxvals * sizeof(struct berval *) ); + *vals = (BerVarray) ch_realloc( (char *) *vals, + (n + nn + 1) * sizeof(struct berval) ); } - for ( i = 0, j = 0; i < naddvals; i++ ) { - if ( addvals[i]->bv_len > 0 ) { - (*vals)[nvals + j] = ber_bvdup( addvals[i] ); - if( (*vals)[nvals + j] != NULL ) j++; - } + v2 = *vals + n; + for ( ; addvals->bv_val; v2++, addvals++ ) { + ber_dupbv(v2, addvals); + if (v2->bv_val == NULL) break; } - (*vals)[nvals + j] = NULL; + v2->bv_val = NULL; + v2->bv_len = 0; - return( 0 ); + return LDAP_SUCCESS; } -#endif -#ifdef SLAPD_SCHEMA_NOT_COMPAT + int value_normalize( AttributeDescription *ad, unsigned usage, struct berval *in, - struct berval **out, + struct berval *out, const char **text ) { int rc; @@ -123,6 +89,7 @@ value_normalize( } /* we only support equality matching of binary attributes */ + /* This is suspect, flexible certificate matching will hit this */ if( slap_ad_is_binary( ad ) && usage != SLAP_MR_EQUALITY ) { *text = "inappropriate binary matching"; return LDAP_INAPPROPRIATE_MATCHING; @@ -138,55 +105,41 @@ value_normalize( return LDAP_INVALID_SYNTAX; } + } else if ( mr->smr_syntax->ssyn_normalize ) { + rc = (mr->smr_syntax->ssyn_normalize)( + ad->ad_type->sat_syntax, + in, out ); + + if( rc != LDAP_SUCCESS ) { + *text = "unable to normalize value"; + return LDAP_INVALID_SYNTAX; + } + } else { - *out = ber_bvdup( in ); + ber_dupbv( out, in ); } return LDAP_SUCCESS; } -#else -void -value_normalize( - char *s, - int syntax -) -{ - char *d, *save; - - if ( ! (syntax & SYNTAX_CIS) ) { - return; - } - if ( syntax & SYNTAX_DN ) { - (void) dn_normalize( s ); - return; - } - - save = s; - for ( d = s; *s; s++ ) { - if ( (syntax & SYNTAX_TEL) && (*s == ' ' || *s == '-') ) { - continue; - } - *d++ = TOUPPER( (unsigned char) *s ); - } - *d = '\0'; -} -#endif - -#ifdef SLAPD_SCHEMA_NOT_COMPAT int value_match( int *match, AttributeDescription *ad, MatchingRule *mr, - struct berval *v1, /* (unnormalized) stored value */ - struct berval *v2, /* (normalized) asserted value */ + unsigned flags, + struct berval *v1, /* stored value */ + void *v2, /* assertion */ const char ** text ) { int rc; - int usage = 0; - struct berval *nv1 = NULL; + struct berval nv1 = { 0, NULL }; + struct berval nv2 = { 0, NULL }; + + if( !mr->smr_match ) { + return LDAP_INAPPROPRIATE_MATCHING; + } if( ad->ad_type->sat_syntax->ssyn_normalize ) { rc = ad->ad_type->sat_syntax->ssyn_normalize( @@ -197,102 +150,84 @@ value_match( } } - if( !mr->smr_match ) { - return LDAP_INAPPROPRIATE_MATCHING; + 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; + } + + /* let smr_match know we've converted the value */ + flags |= SLAP_MR_VALUE_SYNTAX_CONVERTED_MATCH; } - rc = (mr->smr_match)( match, usage, + rc = (mr->smr_match)( match, flags, ad->ad_type->sat_syntax, mr, - nv1 != NULL ? nv1 : v1, - v2 ); + nv1.bv_val != NULL ? &nv1 : v1, + nv2.bv_val != NULL ? &nv2 : v2 ); - ber_bvfree( nv1 ); + if (nv1.bv_val ) free( nv1.bv_val ); + if (nv2.bv_val ) free( nv2.bv_val ); return rc; } -#else -int -value_cmp( - struct berval *v1, - struct berval *v2, - int syntax, - int normalize /* 1 => arg 1; 2 => arg 2; 3 => both */ -) + +int value_find_ex( + AttributeDescription *ad, + unsigned flags, + BerVarray vals, + struct berval *val ) { - int rc; + int i; + int rc; + struct berval nval = { 0, NULL }; + struct berval nval_tmp; + MatchingRule *mr = ad->ad_type->sat_equality; - if ( normalize & 1 ) { - v1 = ber_bvdup( v1 ); - value_normalize( v1->bv_val, syntax ); - } - if ( normalize & 2 ) { - v2 = ber_bvdup( v2 ); - value_normalize( v2->bv_val, syntax ); + if( mr == NULL || !mr->smr_match ) { + return LDAP_INAPPROPRIATE_MATCHING; } - switch ( syntax ) { - case SYNTAX_CIS: - case (SYNTAX_CIS | SYNTAX_TEL): - case (SYNTAX_CIS | SYNTAX_DN): - rc = strcasecmp( v1->bv_val, v2->bv_val ); - break; - - case SYNTAX_CES: - rc = strcmp( v1->bv_val, v2->bv_val ); - break; - - default: /* Unknown syntax */ - case SYNTAX_BIN: - rc = (v1->bv_len == v2->bv_len - ? memcmp( v1->bv_val, v2->bv_val, v1->bv_len ) - : v1->bv_len > v2->bv_len ? 1 : -1); - break; - } + /* Take care of this here or ssyn_normalize later will hurt */ + 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; + } - if ( normalize & 1 ) { - ber_bvfree( v1 ); - } - if ( normalize & 2 ) { - ber_bvfree( v2 ); + /* let value_match know we've done the version */ + flags |= SLAP_MR_VALUE_SYNTAX_CONVERTED_MATCH; } - return( rc ); -} -#endif + if( mr->smr_syntax->ssyn_normalize ) { + rc = mr->smr_syntax->ssyn_normalize( + mr->smr_syntax, nval.bv_val == NULL ? val : &nval, &nval_tmp ); -#ifdef SLAPD_SCHEMA_NOT_COMPAT -int value_find( - AttributeDescription *ad, - MatchingRule *mr, - struct berval **vals, - struct berval *val, - const char ** text ) -#else -int -value_find( - struct berval **vals, - struct berval *v, - int syntax, - int normalize ) -#endif -{ - int i; + free(nval.bv_val); + nval = nval_tmp; + if( rc != LDAP_SUCCESS ) { + free(nval.bv_val); + return LDAP_INAPPROPRIATE_MATCHING; + } + } - for ( i = 0; vals[i] != NULL; i++ ) { -#ifdef SLAPD_SCHEMA_NOT_COMPAT - int rc; + for ( i = 0; vals[i].bv_val != NULL; i++ ) { int match; - rc = value_match( &match, ad, mr, vals[i], val, text ); + const char *text; + + rc = value_match( &match, ad, mr, flags, + &vals[i], nval.bv_val == NULL ? val : &nval, &text ); - if( rc == LDAP_SUCCESS && match == 0 ) -#else - if ( value_cmp( vals[i], v, syntax, normalize ) == 0 ) -#endif - { + if( rc == LDAP_SUCCESS && match == 0 ) { + free( nval.bv_val ); return LDAP_SUCCESS; } } + free( nval.bv_val ); return LDAP_NO_SUCH_ATTRIBUTE; }