X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fmods.c;h=6e7d7ec1c5b8e1e42f227d37253cf8a831bac9dd;hb=f955f17076dc185a589d90baa2acd33afc4c1448;hp=bda5738a47c774f5dbb8f7ff173b0bc72eacb185;hpb=7760b20f7fda4603b6d37a29fd9e426505a21a1c;p=openldap diff --git a/servers/slapd/mods.c b/servers/slapd/mods.c index bda5738a47..6e7d7ec1c5 100644 --- a/servers/slapd/mods.c +++ b/servers/slapd/mods.c @@ -1,7 +1,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 1998-2004 The OpenLDAP Foundation. + * Copyright 1998-2005 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -174,7 +174,7 @@ modify_delete_values( Attribute *a; MatchingRule *mr = mod->sm_desc->ad_type->sat_equality; char dummy = '\0'; - int match = 0; + int match = 0; /* * If permissive is set, then the non-existence of an @@ -219,9 +219,13 @@ modify_delete_values( return LDAP_NO_SUCH_ATTRIBUTE; } - for ( i = 0; mod->sm_values[i].bv_val != NULL; i++ ) { + for ( i = 0; !BER_BVISNULL( &mod->sm_values[i] ); i++ ) { int found = 0; - for ( j = 0; a->a_vals[j].bv_val != NULL; j++ ) { + for ( j = 0; !BER_BVISNULL( &a->a_vals[j] ); j++ ) { + /* skip already deleted values */ + if ( a->a_vals[j].bv_val == &dummy ) { + continue; + } if( mod->sm_nvalues ) { assert( a->a_nvals ); @@ -283,7 +287,7 @@ modify_delete_values( } /* compact array skipping dummies */ - for ( k = 0, j = 0; a->a_vals[k].bv_val != NULL; k++ ) { + for ( k = 0, j = 0; !BER_BVISNULL( &a->a_vals[k] ); k++ ) { /* skip dummies */ if( a->a_vals[k].bv_val == &dummy ) { assert( a->a_nvals == NULL || a->a_nvals[k].bv_val == &dummy ); @@ -299,11 +303,13 @@ modify_delete_values( j++; } - a->a_vals[j].bv_val = NULL; - if (a->a_nvals != a->a_vals) a->a_nvals[j].bv_val = NULL; + BER_BVZERO( &a->a_vals[j] ); + if (a->a_nvals != a->a_vals) { + BER_BVZERO( &a->a_nvals[j] ); + } /* if no values remain, delete the entire attribute */ - if ( a->a_vals[0].bv_val == NULL ) { + if ( BER_BVISNULL( &a->a_vals[0] ) ) { if ( attr_delete( &e->e_attrs, mod->sm_desc ) ) { *text = textbuf; snprintf( textbuf, textlen, @@ -364,7 +370,7 @@ modify_increment_values( return LDAP_SUCCESS; } - for( i=0; a->a_nvals[i].bv_val != NULL; i++ ) { + for( i = 0; !BER_BVISNULL( &a->a_nvals[i] ); i++ ) { char *tmp; long value = atol( a->a_nvals[i].bv_val ); size_t strln = snprintf( str, sizeof(str), "%ld", value+incr );