From 5255c20514b69bdcf7d1ff56457afd30c0700bff Mon Sep 17 00:00:00 2001
From: Pierangelo Masarati <ando@openldap.org>
Date: Fri, 14 Sep 2007 23:28:38 +0000
Subject: [PATCH] import fix to ITS#5136

---
 CHANGES               |  1 +
 servers/slapd/value.c | 16 +++++++++++++++-
 2 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/CHANGES b/CHANGES
index 6dbd333871..c0367ad762 100644
--- a/CHANGES
+++ b/CHANGES
@@ -3,5 +3,6 @@ OpenLDAP 2.4 Change Log
 OpenLDAP 2.4.6 Engineering
 	Fixed slapd ACL sets memory handling (ITS#4873)
 	Added slapd ACL sets DN ancestors operator (ITS#4860)
+	Fixed slapd ordered values add normalization issue (ITS#5136)
 	Fixed slapd-ldap SASL idassert w/o autchId
 	Fixed slapo-rwm modlist handling (ITS#5124)
diff --git a/servers/slapd/value.c b/servers/slapd/value.c
index f6332eea62..ac6ddd3c53 100644
--- a/servers/slapd/value.c
+++ b/servers/slapd/value.c
@@ -718,7 +718,21 @@ ordered_value_add(
 	}
 
 	new = ch_malloc( (anum+vnum+1) * sizeof(struct berval));
-	if ( a->a_nvals && a->a_nvals != a->a_vals ) {
+
+	/* sanity check: if normalized modifications come in, either
+	 * no values are present or normalized existing values differ
+	 * from non-normalized; if no normalized modifications come in,
+	 * either no values are present or normalized existing values
+	 * don't differ from non-normalized */
+	if ( nvals != NULL ) {
+		assert( nvals != vals );
+		assert( a->a_nvals == NULL || a->a_nvals != a->a_vals );
+
+	} else {
+		assert( a->a_nvals == NULL || a->a_nvals == a->a_vals );
+	}
+
+	if ( ( a->a_nvals && a->a_nvals != a->a_vals ) || nvals != NULL ) {
 		nnew = ch_malloc( (anum+vnum+1) * sizeof(struct berval));
 		/* Shouldn't happen... */
 		if ( !nvals ) nvals = vals;
-- 
GitLab