From a5227fc00c5e79f63a41eeea3fc23eebb22f3f94 Mon Sep 17 00:00:00 2001 From: Quanah Gibson-Mount 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 ); -- 2.39.5