X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fvalue.c;h=071286a0ee506f2d825d46856dcc14968f4a9332;hb=01c38dd6ea7f02cfdc9f77f9299771a4ef6ce968;hp=2b663b9a34cebdda856a39b13fe3a53c2be61160;hpb=d959a7a7b5fc8550b7103ed1e51b95ab0764d379;p=openldap diff --git a/servers/slapd/value.c b/servers/slapd/value.c index 2b663b9a34..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 ) { @@ -271,7 +275,9 @@ ordered_value_renumber( Attribute *a, int vals ) ibv.bv_len = sprintf(ibv.bv_val, "{%d}", i); vtmp = a->a_vals[i]; if ( vtmp.bv_val[0] == '{' ) { - ptr = strchr(vtmp.bv_val, '}') + 1; + ptr = ber_bvchr(&vtmp, '}'); + assert( ptr != NULL ); + ++ptr; vtmp.bv_len -= ptr - vtmp.bv_val; vtmp.bv_val = ptr; } @@ -286,7 +292,9 @@ ordered_value_renumber( Attribute *a, int vals ) if ( a->a_nvals && a->a_nvals != a->a_vals ) { vtmp = a->a_nvals[i]; if ( vtmp.bv_val[0] == '{' ) { - ptr = strchr(vtmp.bv_val, '}') + 1; + ptr = ber_bvchr(&vtmp, '}'); + assert( ptr != NULL ); + ++ptr; vtmp.bv_len -= ptr - vtmp.bv_val; vtmp.bv_val = ptr; } @@ -321,7 +329,7 @@ ordered_value_sort( Attribute *a, int do_renumber ) if ( a->a_vals[i].bv_val[0] == '{' ) { char *ptr; index = 1; - ptr = strchr( a->a_vals[i].bv_val, '}' ); + ptr = ber_bvchr( &a->a_vals[i], '}' ); if ( !ptr ) return LDAP_INVALID_SYNTAX; if ( noindex ) @@ -345,7 +353,7 @@ ordered_value_sort( Attribute *a, int do_renumber ) a->a_nvals = ch_malloc( (vals+1)*sizeof(struct berval)); BER_BVZERO(a->a_nvals+vals); for ( i=0; ia_vals[i].bv_val, '}') + 1; + char *ptr = ber_bvchr(&a->a_vals[i], '}') + 1; a->a_nvals[i].bv_len = a->a_vals[i].bv_len - (ptr - a->a_vals[i].bv_val); a->a_nvals[i].bv_val = ch_malloc( a->a_nvals[i].bv_len + 1); @@ -353,7 +361,7 @@ ordered_value_sort( Attribute *a, int do_renumber ) } } else { for ( i=0; ia_nvals[i].bv_val, '}') + 1; + char *ptr = ber_bvchr(&a->a_nvals[i], '}') + 1; a->a_nvals[i].bv_len -= ptr - a->a_nvals[i].bv_val; strcpy(a->a_nvals[i].bv_val, ptr); } @@ -405,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; @@ -423,14 +432,17 @@ ordered_value_validate( if ( bv.bv_val[0] == '{' ) { char *ptr; - ptr = strchr( bv.bv_val, '}' ); - if ( ptr == NULL || ptr > &bv.bv_val[ bv.bv_len ] ) { + ptr = ber_bvchr( &bv, '}' ); + if ( ptr == NULL ) { return LDAP_INVALID_SYNTAX; } ptr++; 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; } } @@ -465,8 +477,8 @@ ordered_value_pretty( if ( bv.bv_val[0] == '{' ) { char *ptr; - ptr = strchr( bv.bv_val, '}' ); - if ( ptr == NULL || ptr > &bv.bv_val[ bv.bv_len ] ) { + ptr = ber_bvchr( &bv, '}' ); + if ( ptr == NULL ) { return LDAP_INVALID_SYNTAX; } ptr++; @@ -528,8 +540,8 @@ ordered_value_normalize( if ( bv.bv_val[ 0 ] == '{' ) { char *ptr; - ptr = strchr( bv.bv_val, '}' ); - if ( ptr == NULL || ptr > &bv.bv_val[ bv.bv_len ] ) { + ptr = ber_bvchr( &bv, '}' ); + if ( ptr == NULL ) { return LDAP_INVALID_SYNTAX; } ptr++; @@ -540,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; } } @@ -600,8 +617,8 @@ ordered_value_match( /* Skip past the assertion index */ if ( bv2.bv_val[0] == '{' ) { - ptr = strchr( bv2.bv_val, '}' ); - if ( ptr == NULL || ptr > &bv2.bv_val[ bv2.bv_len ] ) { + ptr = ber_bvchr( &bv2, '}' ); + if ( ptr == NULL ) { return LDAP_INVALID_SYNTAX; } ptr++; @@ -631,8 +648,8 @@ ordered_value_match( } /* Skip past the attribute index */ if ( bv1.bv_val[0] == '{' ) { - ptr = strchr( bv1.bv_val, '}' ); - if ( ptr == NULL || ptr > &bv1.bv_val[ bv1.bv_len ] ) { + ptr = ber_bvchr( &bv1, '}' ); + if ( ptr == NULL ) { return LDAP_INVALID_SYNTAX; } ptr++; @@ -674,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; } @@ -696,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;