]> git.sur5r.net Git - openldap/commitdiff
canonicalize undef objectClass names (much like attributes; ITS#5681)
authorPierangelo Masarati <ando@openldap.org>
Thu, 4 Sep 2008 08:05:17 +0000 (08:05 +0000)
committerPierangelo Masarati <ando@openldap.org>
Thu, 4 Sep 2008 08:05:17 +0000 (08:05 +0000)
servers/slapd/back-ldap/search.c
servers/slapd/back-meta/search.c
servers/slapd/oc.c

index fb32cb0373acb404bee976057f47d0cc12152cf7..bcc843f1ebb5f28524ddc2fa49a99be398fac1f9 100644 (file)
@@ -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;
index 1f50ce622beba122a79248f1224ab6f777677225..da9fa387ec965150073752bcd8bb57ddfd7d62ea 100644 (file)
@@ -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 );
                                }
                        }
                /*
index b6d574be670befad36ef4e3ff4213cfcfb48f027..7fa10b01771c3292a60c56909aab9f558d44fcb6 100644 (file)
@@ -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 );