]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/schema_check.c
Bug fix for new sockbuf code under NT. Added mutex protection against
[openldap] / servers / slapd / schema_check.c
index 6aad6a2bea766b33c4e15f79b7170491af4fa2e6..d1c00935c31ff32fea0427985b83de765acf6dd4 100644 (file)
 #include "slap.h"
 #include "ldap_pvt.h"
 
-#ifdef SLAPD_SCHEMA_NOT_COMPAT
-static int oc_check_allowed(
-       AttributeType *type,
-       struct berval **oclist );
-#else
+#ifndef SLAPD_SCHEMA_NOT_COMPAT
 static int             oc_check_allowed(char *type, struct berval **oclist);
 #endif
 static char *  oc_check_required(Entry *e, struct berval *ocname);
@@ -45,6 +41,7 @@ entry_schema_check(
 #else
        static const char *ad_objectClass = "objectclass";
 #endif
+       int extensible = 0;
 
        if( !global_schemacheck ) return LDAP_SUCCESS;
 
@@ -52,8 +49,6 @@ entry_schema_check(
        if ( (aoc = attr_find( e->e_attrs, ad_objectClass )) == NULL ) {
                Debug( LDAP_DEBUG_ANY, "No object class for entry (%s)\n",
                    e->e_dn, 0, 0 );
-               assert(0);
-
                *text = "no objectclass attribute";
                return oldattrs != NULL
                        ? LDAP_OBJECT_CLASS_VIOLATION
@@ -66,8 +61,8 @@ entry_schema_check(
        for ( i = 0; aoc->a_vals[i] != NULL; i++ ) {
                if ( (oc = oc_find( aoc->a_vals[i]->bv_val )) == NULL ) {
                        Debug( LDAP_DEBUG_ANY,
-                               "Objectclass \"%s\" not defined\n",
-                               aoc->a_vals[i]->bv_val, 0, 0 );
+                               "entry_check_schema(%s): objectclass \"%s\" not defined\n",
+                               e->e_dn, aoc->a_vals[i]->bv_val, 0 );
 
                } else {
                        char *s = oc_check_required( e, aoc->a_vals[i] );
@@ -80,6 +75,16 @@ entry_schema_check(
                                ret = LDAP_OBJECT_CLASS_VIOLATION;
                                break;
                        }
+
+#ifdef SLAPD_SCHEMA_NOT_COMPAT
+                       if( oc == slap_schema.si_oc_extensibleObject )
+#else
+                       if( !strcmp( aoc->a_vals[i], "extensibleObject" ) == 0 )
+#endif
+                       {
+                               extensible=1;
+                       }
+
                }
        }
 
@@ -87,6 +92,10 @@ entry_schema_check(
            return ret;
        }
 
+       if( extensible ) {
+               return LDAP_SUCCESS;
+       }
+
        /* check that each attr in the entry is allowed by some oc */
        for ( a = e->e_attrs; a != NULL; a = a->a_next ) {
 #ifdef SLAPD_SCHEMA_NOT_COMPAT
@@ -183,8 +192,10 @@ oc_check_required( Entry *e, struct berval *ocname )
        return( NULL );
 }
 
-static int
-oc_check_allowed(
+#ifndef SLAPD_SCHEMA_NOT_COMPAT
+static
+#endif
+int oc_check_allowed(
 #ifdef SLAPD_SCHEMA_NOT_COMPAT
        AttributeType *at,
 #else