From a5227fc00c5e79f63a41eeea3fc23eebb22f3f94 Mon Sep 17 00:00:00 2001
From: Quanah Gibson-Mount <quanah@openldap.org>
Date: Thu, 4 Sep 2008 22:11:37 +0000
Subject: [PATCH] ITS#5681

---
 CHANGES                          | 1 +
 servers/slapd/back-ldap/search.c | 6 ++++--
 servers/slapd/back-meta/search.c | 8 ++++++++
 servers/slapd/oc.c               | 3 +++
 4 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/CHANGES b/CHANGES
index 013048f115..216c7a6391 100644
--- a/CHANGES
+++ b/CHANGES
@@ -9,6 +9,7 @@ OpenLDAP 2.4.12 Engineering
 	Fixed slapd dynacl mask handling (ITS#5637)
 	Fixed slapd firstComponentMatch normalization (ITS#5634)
 	Added slapd caseIgnoreListMatch (ITS#5608)
+	Fixed slapd objectClass canonicalization (ITS#5681)
 	Fixed slapd overlay control registration (ITS#5649)
 	Fixed slapd socket closing on Windows (ITS#5606)
 	Fixed slapd sortvals comparison (ITS#5578)
diff --git a/servers/slapd/back-ldap/search.c b/servers/slapd/back-ldap/search.c
index fb32cb0373..bcc843f1eb 100644
--- a/servers/slapd/back-ldap/search.c
+++ b/servers/slapd/back-ldap/search.c
@@ -713,11 +713,13 @@ ldap_build_entry(
 			}
 
 			if ( rc != LDAP_SUCCESS ) {
+				ObjectClass *oc;
+
 				/* check if, by chance, it's an undefined objectClass */
 				if ( attr->a_desc == slap_schema.si_ad_objectClass &&
-						oc_bvfind_undef( &attr->a_vals[i] ) != NULL )
+						( oc = oc_bvfind_undef( &attr->a_vals[i] ) ) != NULL )
 				{
-					ber_dupbv( &pval, &attr->a_vals[i] );
+					ber_dupbv( &pval, &oc->soc_cname );
 
 				} else {
 					attr->a_nvals = NULL;
diff --git a/servers/slapd/back-meta/search.c b/servers/slapd/back-meta/search.c
index 1f50ce622b..da9fa387ec 100644
--- a/servers/slapd/back-meta/search.c
+++ b/servers/slapd/back-meta/search.c
@@ -1905,6 +1905,8 @@ meta_send_entry(
 			struct berval 	*bv;
 
 			for ( bv = attr->a_vals; !BER_BVISNULL( bv ); bv++ ) {
+				ObjectClass *oc;
+
 				ldap_back_map( &mi->mi_targets[ target ]->mt_rwmap.rwm_oc,
 						bv, &mapped, BACKLDAP_REMAP );
 				if ( BER_BVISNULL( &mapped ) || mapped.bv_val[0] == '\0') {
@@ -1936,6 +1938,12 @@ remove_oc:;
 					}
 
 					ber_bvreplace( bv, &mapped );
+
+				} else if ( ( oc = oc_bvfind_undef( bv ) ) == NULL ) {
+					goto remove_oc;
+
+				} else {
+					ber_bvreplace( bv, &oc->soc_cname );
 				}
 			}
 		/*
diff --git a/servers/slapd/oc.c b/servers/slapd/oc.c
index b6d574be67..7fa10b0177 100644
--- a/servers/slapd/oc.c
+++ b/servers/slapd/oc.c
@@ -228,6 +228,9 @@ oc_bvfind_undef( struct berval *ocname )
 	oc->soc_cname.bv_val = (char *)&oc[ 1 ];
 	AC_MEMCPY( oc->soc_cname.bv_val, ocname->bv_val, ocname->bv_len );
 
+	/* canonical to upper case */
+	ldap_pvt_str2upper( oc->soc_cname.bv_val );
+
 	LDAP_STAILQ_NEXT( oc, soc_next ) = NULL;
 	ldap_pvt_thread_mutex_lock( &oc_undef_mutex );
 	LDAP_STAILQ_INSERT_HEAD( &oc_undef_list, oc, soc_next );
-- 
GitLab