]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/oc.c
Bug fix for new sockbuf code under NT. Added mutex protection against
[openldap] / servers / slapd / oc.c
index 0b6feef114e54caed739bc2d840a6d4399724b11..c2a5c510d55a5601fe51fd1326ee004b52fb3181 100644 (file)
 #include "slap.h"
 #include "ldap_pvt.h"
 
+int is_object_subclass(
+       ObjectClass *sub,
+       ObjectClass *sup )
+{
+       int i;
+
+       if( sup == sub ) {
+               return 1;
+       }
+
+       if( sup->soc_sups == NULL ) {
+               return 0;
+       }
+
+       for( i=0; sup->soc_sups[i] != NULL; i++ ) {
+               if( is_object_subclass( sup->soc_sups[i], sup ) ) {
+                       return 1;
+               }
+       }
+
+       return 0;
+}
+
 int is_entry_objectclass(
        Entry*  e,
 #ifdef SLAPD_SCHEMA_NOT_COMPAT
@@ -93,7 +116,7 @@ static char *oc_op_usermod_attrs[] = {
         * which slapd supports modification of.
         *
         * Currently none.
-        * Likely candidate, "aci"
+        * Likely candidate, "OpenLDAPaci"
         */
        NULL
 };
@@ -116,7 +139,6 @@ static char *oc_op_attrs[] = {
        "supportedControl",
        "supportedSASLMechanisms",
        "supportedLDAPversion",
-       "supportedACIMechanisms",
        "subschemaSubentry",            /* NO USER MOD */
        NULL
 
@@ -205,6 +227,11 @@ oc_index_cmp(
     struct oindexrec   *oir2
 )
 {
+       assert( oir1->oir_name );
+       assert( oir1->oir_oc );
+       assert( oir2->oir_name );
+       assert( oir2->oir_oc );
+
        return (strcasecmp( oir1->oir_name, oir2->oir_name ));
 }
 
@@ -214,18 +241,27 @@ oc_index_name_cmp(
     struct oindexrec   *oir
 )
 {
+       assert( oir->oir_name );
+       assert( oir->oir_oc );
+
        return (strcasecmp( name, oir->oir_name ));
 }
 
 ObjectClass *
 oc_find( const char *ocname )
 {
-       struct oindexrec        *oir = NULL;
+       struct oindexrec        *oir;
+
+       oir = (struct oindexrec *) avl_find( oc_index, ocname,
+            (AVL_CMP) oc_index_name_cmp );
+
+       if ( oir != NULL ) {
+               assert( oir->oir_name );
+               assert( oir->oir_oc );
 
-       if ( (oir = (struct oindexrec *) avl_find( oc_index, ocname,
-            (AVL_CMP) oc_index_name_cmp )) != NULL ) {
                return( oir->oir_oc );
        }
+
        return( NULL );
 }
 
@@ -377,34 +413,51 @@ oc_insert(
                        ch_calloc( 1, sizeof(struct oindexrec) );
                oir->oir_name = soc->soc_oid;
                oir->oir_oc = soc;
+
+               assert( oir->oir_name );
+               assert( oir->oir_oc );
+
                if ( avl_insert( &oc_index, (caddr_t) oir,
                                 (AVL_CMP) oc_index_cmp,
-                                (AVL_DUP) avl_dup_error ) ) {
+                                (AVL_DUP) avl_dup_error ) )
+               {
                        *err = soc->soc_oid;
+                       ldap_memfree(oir->oir_name);
                        ldap_memfree(oir);
                        return SLAP_SCHERR_DUP_CLASS;
                }
+
                /* FIX: temporal consistency check */
-               oc_find(oir->oir_name);
+               assert( oc_find(oir->oir_name) != NULL );
        }
+
        if ( (names = soc->soc_names) ) {
                while ( *names ) {
                        oir = (struct oindexrec *)
                                ch_calloc( 1, sizeof(struct oindexrec) );
                        oir->oir_name = ch_strdup(*names);
                        oir->oir_oc = soc;
+
+                       assert( oir->oir_name );
+                       assert( oir->oir_oc );
+
                        if ( avl_insert( &oc_index, (caddr_t) oir,
                                         (AVL_CMP) oc_index_cmp,
-                                        (AVL_DUP) avl_dup_error ) ) {
+                                        (AVL_DUP) avl_dup_error ) )
+                       {
                                *err = *names;
+                               ldap_memfree(oir->oir_name);
                                ldap_memfree(oir);
                                return SLAP_SCHERR_DUP_CLASS;
                        }
+
                        /* FIX: temporal consistency check */
-                       oc_find(oir->oir_name);
+                       assert( oc_find(oir->oir_name) != NULL );
+
                        names++;
                }
        }
+
        return 0;
 }
 
@@ -481,8 +534,10 @@ oc_schema_info( Entry *e )
                        return -1;
                }
                val.bv_len = strlen( val.bv_val );
+#if 0
                Debug( LDAP_DEBUG_TRACE, "Merging oc [%ld] %s\n",
               (long) val.bv_len, val.bv_val, 0 );
+#endif
                attr_merge( e, ad_objectClasses, vals );
                ldap_memfree( val.bv_val );
        }