X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fmods.c;h=4be7849f2da30c4e0807915458bd6300245684f9;hb=86bd3651e1bc6129cf2bd4ba271f33207843aaff;hp=956ccfb78f3ddb1a1333443c8d8b21f8fc78633c;hpb=d882ce511d9cd3fa9215e2bea29a76df985e0300;p=openldap diff --git a/servers/slapd/mods.c b/servers/slapd/mods.c index 956ccfb78f..4be7849f2d 100644 --- a/servers/slapd/mods.c +++ b/servers/slapd/mods.c @@ -90,7 +90,7 @@ modify_add_values( for ( p = i = 0; !BER_BVISNULL( &mod->sm_values[i] ); i++ ) { int match; - assert( a->a_vals[0].bv_val ); + assert( a->a_vals[0].bv_val != NULL ); for ( j = 0; !BER_BVISNULL( &a->a_vals[j] ); j++ ) { if ( mod->sm_nvalues ) { rc = ordered_value_match( &match, mod->sm_desc, mr, @@ -143,7 +143,7 @@ modify_add_values( } /* no - add them */ - if ( mod->sm_desc->ad_type->sat_flags & SLAP_AT_ORDERED ) { + if ( mod->sm_desc->ad_type->sat_flags & SLAP_AT_ORDERED_VAL ) { rc = ordered_value_add( e, mod->sm_desc, a, pmod.sm_values, pmod.sm_nvalues ); } else { @@ -169,11 +169,23 @@ modify_add_values( int modify_delete_values( + Entry *e, + Modification *m, + int perm, + const char **text, + char *textbuf, size_t textlen ) +{ + return modify_delete_vindex( e, m, perm, text, textbuf, textlen, NULL ); +} + +int +modify_delete_vindex( Entry *e, Modification *mod, int permissive, const char **text, - char *textbuf, size_t textlen ) + char *textbuf, size_t textlen, + int *idx ) { int i, j, k, rc = LDAP_SUCCESS; Attribute *a; @@ -233,7 +245,7 @@ modify_delete_values( } if( mod->sm_nvalues ) { - assert( a->a_nvals ); + assert( a->a_nvals != NULL ); rc = ordered_value_match( &match, a->a_desc, mr, SLAP_MR_EQUALITY | SLAP_MR_VALUE_OF_ASSERTION_SYNTAX | SLAP_MR_ASSERTED_VALUE_NORMALIZED_MATCH @@ -262,6 +274,9 @@ modify_delete_values( found = 1; + if ( idx ) + idx[i] = j; + /* delete value and mark it as dummy */ free( a->a_vals[j].bv_val ); a->a_vals[j].bv_val = &dummy; @@ -318,7 +333,7 @@ modify_delete_values( mod->sm_desc->ad_cname.bv_val ); rc = LDAP_NO_SUCH_ATTRIBUTE; } - } else if ( a->a_desc->ad_type->sat_flags & SLAP_AT_ORDERED ) { + } else if ( a->a_desc->ad_type->sat_flags & SLAP_AT_ORDERED_VAL ) { /* For an ordered attribute, renumber the value indices */ ordered_value_sort( a, 1 ); } @@ -417,14 +432,16 @@ slap_mod_free( void slap_mods_free( - Modifications *ml ) + Modifications *ml, + int freevals ) { Modifications *next; for ( ; ml != NULL; ml = next ) { next = ml->sml_next; - slap_mod_free( &ml->sml_mod, 0 ); + if ( freevals ) + slap_mod_free( &ml->sml_mod, 0 ); free( ml ); } }