]> git.sur5r.net Git - openldap/commitdiff
import fix to ITS#5088
authorPierangelo Masarati <ando@openldap.org>
Sat, 11 Aug 2007 09:39:30 +0000 (09:39 +0000)
committerPierangelo Masarati <ando@openldap.org>
Sat, 11 Aug 2007 09:39:30 +0000 (09:39 +0000)
CHANGES
servers/slapd/back-sql/entry-id.c

diff --git a/CHANGES b/CHANGES
index 15f2aeebddd77b95564bf38fcb9c5072bac7cc36..d30f905b7485a284ab54f00b5f760bef10f17da6 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -11,6 +11,7 @@ OpenLDAP 2.3.38 Engineering
        Fixed slapd-bdb spurious empty DN warnings during add (ITS#5079)
        Fixed slapd-hdb slapacl behavior (ITS#5087)
        Fixed slapd-relay configuration (ITS#4322,ITS#4340)
+       Fixed slapd-sql structuralObjectClass issue (ITS#5088)
        Fixed slapo-syncprov uninit'd vars (ITS#5048,#5049)
        Fixed libldap ldap_add_result_entry (ITS#5056)
        Removed lint
index 72928e5204db299206d201b10d8c91ec9983263f..b96a41cb148262a59489f22026efd9932f170030 100644 (file)
@@ -1002,12 +1002,14 @@ next:;
                        || an_find( bsi->bsi_attrs, &AllOper )
                        || an_find( bsi->bsi_attrs, &slap_schema.si_ad_structuralObjectClass->ad_cname ) )
        {
+               ObjectClass     *soc = NULL;
+
                if ( BACKSQL_CHECK_SCHEMA( bi ) ) {
                        Attribute       *a;
                        const char      *text = NULL;
                        char            textbuf[ 1024 ];
                        size_t          textlen = sizeof( textbuf );
-                       struct berval   soc,
+                       struct berval   soc_name,
                                        bv[ 2 ],
                                        *nvals;
                        int             rc = LDAP_SUCCESS;
@@ -1023,7 +1025,7 @@ next:;
                                nvals = bv;
                        }
 
-                       rc = structural_class( nvals, &soc, NULL
+                       rc = structural_class( nvals, &soc_name, &soc
                                        &text, textbuf, textlen );
                        if ( rc != LDAP_SUCCESS ) {
                                Debug( LDAP_DEBUG_TRACE, "backsql_id2entry(%s): "
@@ -1034,21 +1036,33 @@ next:;
                                return rc;
                        }
 
-                       if ( !bvmatch( &soc, &bsi->bsi_oc->bom_oc->soc_cname ) ) {
+                       if ( !bvmatch( &soc->soc_cname, &bsi->bsi_oc->bom_oc->soc_cname ) ) {
+                               if ( !is_object_subclass( bsi->bsi_oc->bom_oc, soc ) ) {
+                                       Debug( LDAP_DEBUG_TRACE, "backsql_id2entry(%s): "
+                                               "computed structuralObjectClass %s "
+                                               "does not match objectClass %s associated "
+                                               "to entry\n",
+                                               bsi->bsi_e->e_name.bv_val, soc->soc_cname.bv_val,
+                                               bsi->bsi_oc->bom_oc->soc_cname.bv_val );
+                                       backsql_entry_clean( op, bsi->bsi_e );
+                                       return rc;
+                               }
+
                                Debug( LDAP_DEBUG_TRACE, "backsql_id2entry(%s): "
                                        "computed structuralObjectClass %s "
-                                       "does not match objectClass %s associated "
+                                       "is subclass of objectClass %s associated "
                                        "to entry\n",
-                                       bsi->bsi_e->e_name.bv_val, soc.bv_val,
+                                       bsi->bsi_e->e_name.bv_val, soc->soc_cname.bv_val,
                                        bsi->bsi_oc->bom_oc->soc_cname.bv_val );
-                               backsql_entry_clean( op, bsi->bsi_e );
-                               return rc;
                        }
+
+               } else {
+                       soc = bsi->bsi_oc->bom_oc;
                }
 
                rc = attr_merge_normalize_one( bsi->bsi_e,
                                slap_schema.si_ad_structuralObjectClass,
-                               &bsi->bsi_oc->bom_oc->soc_cname,
+                               &soc->soc_cname,
                                bsi->bsi_op->o_tmpmemctx );
                if ( rc != LDAP_SUCCESS ) {
                        backsql_entry_clean( op, bsi->bsi_e );