From ff931f8f55d776eaea3eeec066ec980f571d4a30 Mon Sep 17 00:00:00 2001
From: Howard Chu <hyc@openldap.org>
Date: Mon, 13 Jan 2014 11:26:46 -0800
Subject: [PATCH] ITS#7778 fix regression from #7329

---
 servers/slapd/back-bdb/modify.c | 11 +++++++++++
 servers/slapd/back-mdb/modify.c | 11 +++++++++++
 2 files changed, 22 insertions(+)

diff --git a/servers/slapd/back-bdb/modify.c b/servers/slapd/back-bdb/modify.c
index 3cab8770ee..a2d7ec03b1 100644
--- a/servers/slapd/back-bdb/modify.c
+++ b/servers/slapd/back-bdb/modify.c
@@ -389,6 +389,7 @@ int bdb_modify_internal(
 					ap->a_nvals,
 					e->e_id, SLAP_INDEX_ADD_OP );
 			} else {
+				int found = 0;
 				/* if this was only an add, we only need to index
 				 * the added values.
 				 */
@@ -396,6 +397,7 @@ int bdb_modify_internal(
 					struct berval *vals;
 					if ( ml->sml_desc != ap->a_desc || !ml->sml_numvals )
 						continue;
+					found = 1;
 					switch( ml->sml_op ) {
 					case LDAP_MOD_ADD:
 					case LDAP_MOD_REPLACE:
@@ -415,6 +417,15 @@ int bdb_modify_internal(
 					if ( rc )
 						break;
 				}
+				/* This attr was affected by a modify of a subtype, so
+				 * there was no direct match in the modlist. Just readd
+				 * all of its values.
+				 */
+				if ( !found ) {
+					rc = bdb_index_values( op, tid, ap->a_desc,
+						ap->a_nvals,
+						e->e_id, SLAP_INDEX_ADD_OP );
+				}
 			}
 			if ( rc != LDAP_SUCCESS ) {
 				Debug( LDAP_DEBUG_ANY,
diff --git a/servers/slapd/back-mdb/modify.c b/servers/slapd/back-mdb/modify.c
index 44805b6e4e..529be7194c 100644
--- a/servers/slapd/back-mdb/modify.c
+++ b/servers/slapd/back-mdb/modify.c
@@ -389,6 +389,7 @@ int mdb_modify_internal(
 					ap->a_nvals,
 					e->e_id, SLAP_INDEX_ADD_OP );
 			} else {
+				int found = 0;
 				/* if this was only an add, we only need to index
 				 * the added values.
 				 */
@@ -396,6 +397,7 @@ int mdb_modify_internal(
 					struct berval *vals;
 					if ( ml->sml_desc != ap->a_desc || !ml->sml_numvals )
 						continue;
+					found = 1;
 					switch( ml->sml_op ) {
 					case LDAP_MOD_ADD:
 					case LDAP_MOD_REPLACE:
@@ -415,6 +417,15 @@ int mdb_modify_internal(
 					if ( rc )
 						break;
 				}
+				/* This attr was affected by a modify of a subtype, so
+				 * there was no direct match in the modlist. Just readd
+				 * all of its values.
+				 */
+				if ( !found ) {
+					rc = mdb_index_values( op, tid, ap->a_desc,
+						ap->a_nvals,
+						e->e_id, SLAP_INDEX_ADD_OP );
+				}
 			}
 			if ( rc != LDAP_SUCCESS ) {
 				Debug( LDAP_DEBUG_ANY,
-- 
GitLab