From 7760b20f7fda4603b6d37a29fd9e426505a21a1c Mon Sep 17 00:00:00 2001 From: Pierangelo Masarati Date: Fri, 6 Aug 2004 16:40:48 +0000 Subject: [PATCH] fix permissive; cleanup --- servers/slapd/mods.c | 78 +++++++++++++++++++++++++------------------- 1 file changed, 44 insertions(+), 34 deletions(-) diff --git a/servers/slapd/mods.c b/servers/slapd/mods.c index 8d91c20327..bda5738a47 100644 --- a/servers/slapd/mods.c +++ b/servers/slapd/mods.c @@ -31,18 +31,19 @@ int modify_add_values( - Entry *e, + Entry *e, Modification *mod, - int permissive, + int permissive, const char **text, - char *textbuf, size_t textlen ) + char *textbuf, + size_t textlen ) { - int rc; - const char *op; - Attribute *a; - Modification pmod = *mod; + int rc; + const char *op; + Attribute *a; + Modification pmod = *mod; - switch( mod->sm_op ) { + switch ( mod->sm_op ) { case LDAP_MOD_ADD: op = "add"; break; @@ -54,10 +55,11 @@ modify_add_values( assert( 0 ); } + /* check if values to add exist in attribute */ a = attr_find( e->e_attrs, mod->sm_desc ); - if( a != NULL ) { /* check if values to add exist in attribute */ - int rc, i, j, p; - MatchingRule *mr; + if ( a != NULL ) { + int rc, i, j, p; + MatchingRule *mr; mr = mod->sm_desc->ad_type->sat_equality; if( mr == NULL || !mr->smr_match ) { @@ -70,12 +72,12 @@ modify_add_values( return LDAP_INAPPROPRIATE_MATCHING; } - if( permissive ) { - for ( i=0; mod->sm_values[i].bv_val; i++ ) /* count 'em */; - pmod.sm_values = (BerVarray) ch_malloc( i*sizeof( struct berval )); - if( pmod.sm_nvalues != NULL ) { - pmod.sm_nvalues = (BerVarray) ch_malloc( - i*sizeof( struct berval )); + if ( permissive ) { + for ( i = 0; !BER_BVISNULL( &mod->sm_values[i] ); i++ ) /* count 'em */; + pmod.sm_values = (BerVarray)ch_malloc( (i + 1)*sizeof( struct berval ) ); + if ( pmod.sm_nvalues != NULL ) { + pmod.sm_nvalues = (BerVarray)ch_malloc( + (i + 1)*sizeof( struct berval ) ); } } @@ -85,11 +87,12 @@ modify_add_values( * server (whether from LDAP or from the underlying * database). */ - for ( p=i=0; mod->sm_values[i].bv_val; i++ ) { - int match; + for ( p = i = 0; !BER_BVISNULL( &mod->sm_values[i] ); i++ ) { + int match; + assert( a->a_vals[0].bv_val ); - for ( j=0; a->a_vals[j].bv_val; j++ ) { - if( mod->sm_nvalues ) { + for ( j = 0; !BER_BVISNULL( &a->a_vals[j] ); j++ ) { + if ( mod->sm_nvalues ) { rc = value_match( &match, mod->sm_desc, mr, SLAP_MR_EQUALITY | SLAP_MR_VALUE_OF_ASSERTION_SYNTAX | SLAP_MR_ASSERTED_VALUE_NORMALIZED_MATCH @@ -101,10 +104,10 @@ modify_add_values( &a->a_vals[j], &mod->sm_values[i], text ); } - if( rc == LDAP_SUCCESS && match == 0 ) { - if( permissive ) break; - + if ( rc == LDAP_SUCCESS && match == 0 ) { /* value already exists */ + if ( permissive ) break; + *text = textbuf; snprintf( textbuf, textlen, "modify/%s: %s: value #%d already exists", @@ -116,31 +119,38 @@ modify_add_values( } } - if( permissive && !match ) { - if( pmod.sm_nvalues ) { + if ( permissive && match != 0 ) { + if ( pmod.sm_nvalues ) { pmod.sm_nvalues[p] = mod->sm_nvalues[i]; } pmod.sm_values[p++] = mod->sm_values[i]; } } - if( permissive && p == 0 ) { - /* all new values match exist */ - ch_free( pmod.sm_values ); - if( pmod.sm_nvalues ) ch_free( pmod.sm_nvalues ); - return LDAP_SUCCESS; + if ( permissive ) { + if ( p == 0 ) { + /* all new values match exist */ + ch_free( pmod.sm_values ); + if ( pmod.sm_nvalues ) ch_free( pmod.sm_nvalues ); + return LDAP_SUCCESS; + } + + BER_BVZERO( &pmod.sm_values[p] ); + if ( pmod.sm_nvalues ) { + BER_BVZERO( &pmod.sm_nvalues[p] ); + } } } /* no - add them */ rc = attr_merge( e, mod->sm_desc, pmod.sm_values, pmod.sm_nvalues ); - if( a != NULL && permissive ) { + if ( a != NULL && permissive ) { ch_free( pmod.sm_values ); - if( pmod.sm_nvalues ) ch_free( pmod.sm_nvalues ); + if ( pmod.sm_nvalues ) ch_free( pmod.sm_nvalues ); } - if( rc != 0 ) { + if ( rc != 0 ) { /* this should return result of attr_merge */ *text = textbuf; snprintf( textbuf, textlen, -- 2.39.5