From bfe9bbe6096c97a2a40bf16c36ee45c6b1f84b70 Mon Sep 17 00:00:00 2001
From: Quanah Gibson-Mount <quanah@openldap.org>
Date: Wed, 3 Sep 2008 01:51:47 +0000
Subject: [PATCH] ITS#5642

---
 CHANGES                     |  1 +
 servers/slapd/at.c          | 18 ++++++++++++++++--
 servers/slapd/schema_prep.c |  1 -
 3 files changed, 17 insertions(+), 3 deletions(-)

diff --git a/CHANGES b/CHANGES
index 61cfa664ee..08835ee6aa 100644
--- a/CHANGES
+++ b/CHANGES
@@ -2,6 +2,7 @@ OpenLDAP 2.4 Change Log
 
 OpenLDAP 2.4.12 Engineering
 	Fixed liblutil executables on Windows (ITS#5604)
+	Fixed slapd custom attribute inheritance (ITS#5642)
 	Fixed slapd firstComponentMatch normalization (ITS#5634)
 	Fixed slapd socket closing on Windows (ITS#5606)
 	Fixed slapd-ldap,slapd-meta invalid filter behavior (ITS#5614)
diff --git a/servers/slapd/at.c b/servers/slapd/at.c
index de44c27561..54d197c495 100644
--- a/servers/slapd/at.c
+++ b/servers/slapd/at.c
@@ -722,8 +722,22 @@ at_add(
 	 * its own superiorss
 	 */
 	if ( sat->sat_sup ) {
-		sat->sat_syntax = sat->sat_sup->sat_syntax;
-		sat->sat_equality = sat->sat_sup->sat_equality;
+		Syntax *syn = syn_find(sat->sat_sup->sat_syntax->ssyn_oid);
+		if ( syn != sat->sat_sup->sat_syntax ) {
+			sat->sat_syntax = ch_malloc( sizeof( Syntax ));
+			*sat->sat_syntax = *sat->sat_sup->sat_syntax;
+		} else {
+			sat->sat_syntax = sat->sat_sup->sat_syntax;
+		}
+		if ( sat->sat_sup->sat_equality ) {
+			MatchingRule *mr = mr_find( sat->sat_sup->sat_equality->smr_oid );
+			if ( mr != sat->sat_sup->sat_equality ) {
+				sat->sat_equality = ch_malloc( sizeof( MatchingRule ));
+				*sat->sat_equality = *sat->sat_sup->sat_equality;
+			} else {
+				sat->sat_equality = sat->sat_sup->sat_equality;
+			}
+		}
 		sat->sat_approx = sat->sat_sup->sat_approx;
 		sat->sat_ordering = sat->sat_sup->sat_ordering;
 		sat->sat_substr = sat->sat_sup->sat_substr;
diff --git a/servers/slapd/schema_prep.c b/servers/slapd/schema_prep.c
index 5bab4a2d0a..42f9a5e943 100644
--- a/servers/slapd/schema_prep.c
+++ b/servers/slapd/schema_prep.c
@@ -1266,7 +1266,6 @@ slap_schema_load( void )
 					mr->smr_filter = ad_map[i].ssam_mr_filter;
 				}
 
-				/* FIXME: no-one will free this at exit */
 				(*adp)->ad_type->sat_equality = mr;
 			}
 		}
-- 
GitLab