X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fvalue.c;h=7911714c27fea32b8d13e786126e4ad2a1bcf882;hb=6782058b9454b3dc498eaca7868061b389d12e17;hp=82fead26c65c39d1f71ef2f4c567ed531c03c675;hpb=16c9e81c802a342e784742cfd456eaca0e4c3a94;p=openldap diff --git a/servers/slapd/value.c b/servers/slapd/value.c index 82fead26c6..7911714c27 100644 --- a/servers/slapd/value.c +++ b/servers/slapd/value.c @@ -1,8 +1,28 @@ /* value.c - routines for dealing with values */ /* $OpenLDAP$ */ +/* This work is part of OpenLDAP Software . + * + * Copyright 1998-2004 The OpenLDAP Foundation. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted only as authorized by the OpenLDAP + * Public License. + * + * A copy of this license is available in the file LICENSE in the + * top-level directory of the distribution or, alternatively, at + * . + */ /* - * Copyright 1998-2003 The OpenLDAP Foundation, All Rights Reserved. - * COPYING RESTRICTIONS APPLY, see COPYRIGHT file + * Copyright (c) 1995 Regents of the University of Michigan. + * All rights reserved. + * + * Redistribution and use in source and binary forms are permitted + * provided that this notice is preserved and that due credit is given + * to the University of Michigan at Ann Arbor. The name of the University + * may not be used to endorse or promote products derived from this + * software without specific prior written permission. This software + * is provided ``as is'' without express or implied warranty. */ #include "portable.h" @@ -20,15 +40,16 @@ int value_add( - BerVarray *vals, - BerVarray addvals -) + BerVarray *vals, + BerVarray addvals ) { - int n, nn; - BerVarray v2; + int n, nn = 0; + BerVarray v2; - for ( nn = 0; addvals != NULL && addvals[nn].bv_val != NULL; nn++ ) - ; /* NULL */ + if ( addvals != NULL ) { + for ( ; !BER_BVISNULL( &addvals[nn] ); nn++ ) + ; /* NULL */ + } if ( *vals == NULL ) { *vals = (BerVarray) SLAP_MALLOC( (nn + 1) @@ -44,8 +65,9 @@ value_add( return LBER_ERROR_MEMORY; } n = 0; + } else { - for ( n = 0; (*vals)[n].bv_val != NULL; n++ ) { + for ( n = 0; !BER_BVISNULL( &(*vals)[n] ); n++ ) { ; /* Empty */ } *vals = (BerVarray) SLAP_REALLOC( (char *) *vals, @@ -62,25 +84,23 @@ value_add( } } - v2 = *vals + n; - for ( ; addvals->bv_val; v2++, addvals++ ) { - ber_dupbv(v2, addvals); - if (v2->bv_val == NULL) break; + v2 = &(*vals)[n]; + for ( ; !BER_BVISNULL( addvals ); v2++, addvals++ ) { + ber_dupbv( v2, addvals ); + if ( BER_BVISNULL( v2 ) ) break; } - v2->bv_val = NULL; - v2->bv_len = 0; + BER_BVZERO( v2 ); return LDAP_SUCCESS; } int value_add_one( - BerVarray *vals, - struct berval *addval -) + BerVarray *vals, + struct berval *addval ) { - int n; - BerVarray v2; + int n; + BerVarray v2; if ( *vals == NULL ) { *vals = (BerVarray) SLAP_MALLOC( 2 * sizeof(struct berval) ); @@ -95,8 +115,9 @@ value_add_one( return LBER_ERROR_MEMORY; } n = 0; + } else { - for ( n = 0; (*vals)[n].bv_val != NULL; n++ ) { + for ( n = 0; !BER_BVISNULL( &(*vals)[n] ); n++ ) { ; /* Empty */ } *vals = (BerVarray) SLAP_REALLOC( (char *) *vals, @@ -113,26 +134,27 @@ value_add_one( } } - v2 = *vals + n; + v2 = &(*vals)[n]; ber_dupbv(v2, addval); v2++; - v2->bv_val = NULL; - v2->bv_len = 0; + BER_BVZERO( v2 ); return LDAP_SUCCESS; } -#ifdef SLAP_NVALUES int asserted_value_validate_normalize( AttributeDescription *ad, MatchingRule *mr, unsigned usage, struct berval *in, struct berval *out, - const char ** text ) + const char ** text, + void *ctx ) { int rc; + struct berval pval; + pval.bv_val = NULL; /* we expect the value to be in the assertion syntax */ assert( !SLAP_MR_IS_VALUE_OF_ATTRIBUTE_SYNTAX(usage) ); @@ -147,179 +169,42 @@ int asserted_value_validate_normalize( return LDAP_INAPPROPRIATE_MATCHING; } - rc = (mr->smr_syntax->ssyn_validate)( mr->smr_syntax, in ); - - if( rc != LDAP_SUCCESS ) { - *text = "value does not conform to assertion syntax"; - return LDAP_INVALID_SYNTAX; - } - - if( mr->smr_normalize ) { - rc = (mr->smr_normalize)( usage, - ad ? ad->ad_type->sat_syntax : NULL, - mr, in, out ); - - if( rc != LDAP_SUCCESS ) { - *text = "unable to normalize value for matching"; - return LDAP_INVALID_SYNTAX; - } + if( mr->smr_syntax->ssyn_pretty ) { + rc = (mr->smr_syntax->ssyn_pretty)( mr->smr_syntax, in, &pval, ctx ); + in = &pval; } else { - ber_dupbv( out, in ); + rc = (mr->smr_syntax->ssyn_validate)( mr->smr_syntax, in ); } -} - -#else -int -value_validate( - MatchingRule *mr, - struct berval *in, - const char **text ) -{ - int rc; - - if( mr == NULL ) { - *text = "inappropriate matching request"; - return LDAP_INAPPROPRIATE_MATCHING; - } - - if( mr->smr_syntax == NULL ) { - *text = "no assertion syntax"; - return LDAP_INVALID_SYNTAX; - } - - if( ! mr->smr_syntax->ssyn_validate ) { - *text = "no syntax validator"; - return LDAP_INVALID_SYNTAX; - } - - rc = (mr->smr_syntax->ssyn_validate)( mr->smr_syntax, in ); if( rc != LDAP_SUCCESS ) { - *text = "value is invalid"; + *text = "value does not conform to assertion syntax"; return LDAP_INVALID_SYNTAX; } - return LDAP_SUCCESS; -} - -int -value_normalize( - AttributeDescription *ad, - unsigned usage, - struct berval *in, - struct berval *out, - const char **text ) -{ - int rc; - MatchingRule *mr = ad_mr( ad, usage ); - - if( mr == NULL ) { - *text = "inappropriate matching request"; - return LDAP_INAPPROPRIATE_MATCHING; - } - - /* 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; - } - if( mr->smr_normalize ) { - rc = (mr->smr_normalize)( usage, - ad->ad_type->sat_syntax, - mr, in, out ); - - if( rc != LDAP_SUCCESS ) { - *text = "unable to normalize value"; - 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 { - ber_dupbv( out, in ); - } - - return LDAP_SUCCESS; -} - -int -value_validate_normalize( - AttributeDescription *ad, - unsigned usage, - struct berval *in, - struct berval *out, - const char **text ) -{ - int rc; - MatchingRule *mr = ad_mr( ad, usage ); - - if( mr == NULL ) { - *text = "inappropriate matching request"; - return LDAP_INAPPROPRIATE_MATCHING; - } - - if( mr->smr_syntax == NULL ) { - *text = "no assertion syntax"; - return LDAP_INVALID_SYNTAX; - } - - if( ! mr->smr_syntax->ssyn_validate ) { - *text = "no syntax validator"; - return LDAP_INVALID_SYNTAX; - } - - rc = (mr->smr_syntax->ssyn_validate)( mr->smr_syntax, in ); - - if( rc != LDAP_SUCCESS ) { - *text = "value is invalid"; - return LDAP_INVALID_SYNTAX; - } - - /* 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; - } + rc = (mr->smr_normalize)( + usage|SLAP_MR_VALUE_OF_ASSERTION_SYNTAX, + ad ? ad->ad_type->sat_syntax : NULL, + mr, in, out, ctx ); - if( mr->smr_normalize ) { - rc = (mr->smr_normalize)( usage, - ad->ad_type->sat_syntax, - mr, in, out ); + if( pval.bv_val ) ber_memfree_x( pval.bv_val, ctx ); if( rc != LDAP_SUCCESS ) { - *text = "unable to normalize value"; + *text = "unable to normalize value for matching"; 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 if ( pval.bv_val != NULL ) { + *out = pval; } else { - ber_dupbv( out, in ); + ber_dupbv_x( out, in, ctx ); } return LDAP_SUCCESS; } -#endif + int value_match( @@ -332,8 +217,6 @@ value_match( const char ** text ) { int rc; - struct berval nv1 = { 0, NULL }; - struct berval nv2 = { 0, NULL }; assert( mr != NULL ); @@ -341,37 +224,9 @@ value_match( return LDAP_INAPPROPRIATE_MATCHING; } -#ifndef SLAP_NVALUES - if( ad->ad_type->sat_syntax->ssyn_normalize ) { - rc = ad->ad_type->sat_syntax->ssyn_normalize( - ad->ad_type->sat_syntax, v1, &nv1 ); - - if( rc != LDAP_SUCCESS ) { - return LDAP_INAPPROPRIATE_MATCHING; - } - } - - if ( SLAP_IS_MR_ATTRIBUTE_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_ATTRIBUTE_SYNTAX_CONVERTED_MATCH; - } -#endif - rc = (mr->smr_match)( match, flags, - ad->ad_type->sat_syntax, - mr, - nv1.bv_val != NULL ? &nv1 : v1, - nv2.bv_val != NULL ? &nv2 : v2 ); + ad->ad_type->sat_syntax, mr, v1, v2 ); - if (nv1.bv_val ) free( nv1.bv_val ); - if (nv2.bv_val ) free( nv2.bv_val ); return rc; } @@ -379,64 +234,32 @@ int value_find_ex( AttributeDescription *ad, unsigned flags, BerVarray vals, - struct berval *val ) + struct berval *val, + void *ctx ) { int i; int rc; - struct berval nval = { 0, NULL }; + struct berval nval = BER_BVNULL; MatchingRule *mr = ad->ad_type->sat_equality; if( mr == NULL || !mr->smr_match ) { return LDAP_INAPPROPRIATE_MATCHING; } -#ifdef SLAP_NVALUES assert(SLAP_IS_MR_ATTRIBUTE_VALUE_NORMALIZED_MATCH( flags )); if( !SLAP_IS_MR_ASSERTED_VALUE_NORMALIZED_MATCH( flags ) && mr->smr_normalize ) { rc = (mr->smr_normalize)( - flags & SLAP_MR_TYPE_MASK|SLAP_MR_SUBTYPE_MASK, + flags & (SLAP_MR_TYPE_MASK|SLAP_MR_SUBTYPE_MASK|SLAP_MR_VALUE_OF_SYNTAX), ad ? ad->ad_type->sat_syntax : NULL, - mr, val, &nval ); + mr, val, &nval, ctx ); if( rc != LDAP_SUCCESS ) { return LDAP_INVALID_SYNTAX; } } -#else - - /* Take care of this here or ssyn_normalize later will hurt */ - if ( SLAP_IS_MR_ATTRIBUTE_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_ATTRIBUTE_SYNTAX_CONVERTED_MATCH; - } - - if( !(flags & SLAP_MR_ASSERTED_VALUE_NORMALIZED_MATCH) && - mr->smr_syntax->ssyn_normalize ) - { - struct berval nval_tmp = { 0, NULL }; - - rc = mr->smr_syntax->ssyn_normalize( - mr->smr_syntax, - nval.bv_val == NULL ? val : &nval, &nval_tmp ); - - free(nval.bv_val); - nval = nval_tmp; - if( rc != LDAP_SUCCESS ) { - free(nval.bv_val); - return LDAP_INAPPROPRIATE_MATCHING; - } - } -#endif for ( i = 0; vals[i].bv_val != NULL; i++ ) { int match; @@ -446,11 +269,11 @@ int value_find_ex( &vals[i], nval.bv_val == NULL ? val : &nval, &text ); if( rc == LDAP_SUCCESS && match == 0 ) { - free( nval.bv_val ); - return LDAP_SUCCESS; + sl_free( nval.bv_val, ctx ); + return rc; } } - free( nval.bv_val ); + sl_free( nval.bv_val, ctx ); return LDAP_NO_SUCH_ATTRIBUTE; }