X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fvalue.c;h=071286a0ee506f2d825d46856dcc14968f4a9332;hb=01c38dd6ea7f02cfdc9f77f9299771a4ef6ce968;hp=cf2d73075e8b16c4cc4039f46a1252502d938d67;hpb=dbb2ceac90c3ab45efcc6aa198fb906e15a7ab9a;p=openldap diff --git a/servers/slapd/value.c b/servers/slapd/value.c index cf2d73075e..071286a0ee 100644 --- a/servers/slapd/value.c +++ b/servers/slapd/value.c @@ -2,7 +2,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 1998-2005 The OpenLDAP Foundation. + * Copyright 1998-2006 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -75,7 +75,7 @@ value_add( } v2 = &(*vals)[n]; - for ( ; !BER_BVISNULL( addvals ); v2++, addvals++ ) { + for ( n = 0 ; n < nn; v2++, addvals++ ) { ber_dupbv( v2, addvals ); if ( BER_BVISNULL( v2 ) ) break; } @@ -153,8 +153,12 @@ int asserted_value_validate_normalize( rc = (mr->smr_syntax->ssyn_pretty)( mr->smr_syntax, in, &pval, ctx ); in = &pval; - } else { + } else if ( mr->smr_syntax->ssyn_validate ) { rc = (mr->smr_syntax->ssyn_validate)( mr->smr_syntax, in ); + + } else { + *text = "inappropriate matching request"; + return LDAP_INAPPROPRIATE_MATCHING; } if( rc != LDAP_SUCCESS ) { @@ -225,14 +229,14 @@ int value_find_ex( return LDAP_INAPPROPRIATE_MATCHING; } - assert(SLAP_IS_MR_ATTRIBUTE_VALUE_NORMALIZED_MATCH( flags )); + assert( SLAP_IS_MR_ATTRIBUTE_VALUE_NORMALIZED_MATCH( flags ) != 0 ); 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|SLAP_MR_VALUE_OF_SYNTAX), - ad ? ad->ad_type->sat_syntax : NULL, + ad->ad_type->sat_syntax, mr, val, &nval, ctx ); if( rc != LDAP_SUCCESS ) { @@ -409,12 +413,13 @@ ordered_value_sort( Attribute *a, int do_renumber ) /* * wrapper for validate function * uses the validate function of the syntax after removing - * the index, if allowed an present + * the index, if allowed and present */ int ordered_value_validate( AttributeDescription *ad, - struct berval *in ) + struct berval *in, + int mop ) { struct berval bv = *in; @@ -435,6 +440,9 @@ ordered_value_validate( bv.bv_len -= ptr - bv.bv_val; bv.bv_val = ptr; in = &bv; + /* If deleting by index, just succeed */ + if ( mop == LDAP_MOD_DELETE && BER_BVISEMPTY( &bv )) + return LDAP_SUCCESS; } } @@ -544,6 +552,11 @@ ordered_value_normalize( bv.bv_len -= idx.bv_len; bv.bv_val = ptr; + /* validator will already prevent this for Adds */ + if ( BER_BVISEMPTY( &bv )) { + ber_dupbv_x( normalized, &idx, ctx ); + return LDAP_SUCCESS; + } val = &bv; } } @@ -678,8 +691,7 @@ ordered_value_add( Attribute **ap; anum = 0; for ( ap=&e->e_attrs; *ap; ap = &(*ap)->a_next ) ; - a = ch_calloc( 1, sizeof(Attribute) ); - a->a_desc = ad; + a = attr_alloc( ad ); *ap = a; } @@ -700,11 +712,13 @@ ordered_value_add( k = -1; if ( vals[i].bv_val[0] == '{' ) { - k = strtol( vals[i].bv_val+1, &next, 0 ); + k = strtol( vals[i].bv_val + 1, &next, 0 ); if ( next == vals[i].bv_val + 1 || next[ 0 ] != '}' || next - vals[i].bv_val > vals[i].bv_len ) { + ch_free( nnew ); + ch_free( new ); return -1; } if ( k > anum ) k = -1;