From 20248e7430f8a7ab975d18f86260b5a727aa2343 Mon Sep 17 00:00:00 2001
From: Kurt Zeilenga <kurt@openldap.org>
Date: Tue, 15 Aug 2000 21:57:28 +0000
Subject: [PATCH] Move delete of last value check out of inner loop.

---
 servers/slapd/back-ldbm/modify.c | 25 +++++++++++++------------
 1 file changed, 13 insertions(+), 12 deletions(-)

diff --git a/servers/slapd/back-ldbm/modify.c b/servers/slapd/back-ldbm/modify.c
index 6d3974cef4..114dbb0c62 100644
--- a/servers/slapd/back-ldbm/modify.c
+++ b/servers/slapd/back-ldbm/modify.c
@@ -379,26 +379,17 @@ delete_values(
 			if( rc == LDAP_SUCCESS && match != 0 ) {
 				continue;
 			}
+
+			/* found a matching value */
 			found = 1;
 
-			/* found a matching value - delete it */
+			/* delete it */
 			ber_bvfree( a->a_vals[j] );
 			for ( k = j + 1; a->a_vals[k] != NULL; k++ ) {
 				a->a_vals[k - 1] = a->a_vals[k];
 			}
 			a->a_vals[k - 1] = NULL;
 
-			/* delete the entire attribute, if no values remain */
-			if ( a->a_vals[0] == NULL) {
-				Debug( LDAP_DEBUG_ARGS,
-					"removing entire attribute %s\n",
-					desc, 0, 0 );
-				if ( attr_delete( &e->e_attrs, mod->sm_desc ) ) {
-					ber_bvfree( asserted );
-					return LDAP_NO_SUCH_ATTRIBUTE;
-				}
-			}
-
 			break;
 		}
 
@@ -413,6 +404,16 @@ delete_values(
 		}
 	}
 
+	/* if no values remain, delete the entire attribute */
+	if ( a->a_vals[0] == NULL ) {
+		Debug( LDAP_DEBUG_ARGS,
+			"removing entire attribute %s\n",
+			desc, 0, 0 );
+		if ( attr_delete( &e->e_attrs, mod->sm_desc ) ) {
+			return LDAP_NO_SUCH_ATTRIBUTE;
+		}
+	}
+
 	return LDAP_SUCCESS;
 }
 
-- 
GitLab