]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/schema_check.c
Eliminate unnecessary Op copies
[openldap] / servers / slapd / schema_check.c
index 7a9448a13ee595b800e33cfbd0570242d6ec788e..4c0d376249473159d7083f03e99014b8b13b36ff 100644 (file)
@@ -2,7 +2,7 @@
 /* $OpenLDAP$ */
 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
  *
- * Copyright 1998-2006 The OpenLDAP Foundation.
+ * Copyright 1998-2007 The OpenLDAP Foundation.
  * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
@@ -171,7 +171,8 @@ entry_schema_check(
                        "entry_check_schema(%s): %s\n",
                        e->e_dn, textbuf, 0 );
 
-               return LDAP_OBJECT_CLASS_VIOLATION;
+               rc = LDAP_OBJECT_CLASS_VIOLATION;
+               goto done;
        }
 
        if( sc->soc_kind != LDAP_SCHEMA_STRUCTURAL ) {
@@ -183,7 +184,8 @@ entry_schema_check(
                        "entry_check_schema(%s): %s\n",
                        e->e_dn, textbuf, 0 );
 
-               return LDAP_OTHER;
+               rc = LDAP_OTHER;
+               goto done;
        }
 
 got_soc:
@@ -196,7 +198,8 @@ got_soc:
                        "entry_check_schema(%s): %s\n",
                        e->e_dn, textbuf, 0 );
 
-               return LDAP_OBJECT_CLASS_VIOLATION;
+               rc = LDAP_OBJECT_CLASS_VIOLATION;
+               goto done;
        }
 
        *text = textbuf;
@@ -206,7 +209,7 @@ got_soc:
                        "unrecognized objectClass '%s'",
                        aoc->a_vals[0].bv_val );
                rc = LDAP_OBJECT_CLASS_VIOLATION;
-               goto leave;
+               goto done;
 
        } else if ( sc != slap_schema.si_oc_glue && sc != oc ) {
                snprintf( textbuf, textlen, 
@@ -214,7 +217,7 @@ got_soc:
                        "from '%s' to '%s' not allowed",
                        asc->a_vals[0].bv_val, oc->soc_cname.bv_val );
                rc = LDAP_NO_OBJECT_CLASS_MODS;
-               goto leave;
+               goto done;
        } else if ( sc == slap_schema.si_oc_glue ) {
                sc = oc;
        }
@@ -223,7 +226,7 @@ got_soc:
        if ( !is_entry_glue ( e ) ) {
                rc = entry_naming_check( e, manage, text, textbuf, textlen );
                if( rc != LDAP_SUCCESS ) {
-                       goto leave;
+                       goto done;
                }
        } else {
                /* Glue Entry */
@@ -247,7 +250,7 @@ got_soc:
                                e->e_dn, textbuf, 0 );
 
                        rc = LDAP_OBJECT_CLASS_VIOLATION;
-                       goto leave;
+                       goto done;
                }
 
                if( cr->scr_required ) for( i=0; cr->scr_required[i]; i++ ) {
@@ -271,7 +274,7 @@ got_soc:
                                        e->e_dn, textbuf, 0 );
 
                                rc = LDAP_OBJECT_CLASS_VIOLATION;
-                               goto leave;
+                               goto done;
                        }
                }
 
@@ -296,7 +299,7 @@ got_soc:
                                        e->e_dn, textbuf, 0 );
 
                                rc = LDAP_OBJECT_CLASS_VIOLATION;
-                               goto leave;
+                               goto done;
                        }
                }
        }
@@ -315,14 +318,14 @@ got_soc:
                                e->e_dn, textbuf, 0 );
 
                        rc = LDAP_OBJECT_CLASS_VIOLATION;
-                       goto leave;
+                       goto done;
                }
 
                if ( oc->soc_check ) {
                        rc = (oc->soc_check)( op->o_bd, e, oc,
                                text, textbuf, textlen );
                        if( rc != LDAP_SUCCESS ) {
-                               goto leave;
+                               goto done;
                        }
                }
 
@@ -362,7 +365,7 @@ got_soc:
                                                e->e_dn, textbuf, 0 );
 
                                        rc = LDAP_OBJECT_CLASS_VIOLATION;
-                                       goto leave;
+                                       goto done;
                                }
                        }
 
@@ -384,24 +387,28 @@ got_soc:
                                                        }
                                                }
                                        }
+                                       if ( k ) {
+                                               snprintf( textbuf, textlen, 
+                                                       "class '%s' not allowed by content rule '%s'",
+                                                       oc->soc_cname.bv_val,
+                                                       ldap_contentrule2name( &cr->scr_crule ) );
+                                       }
                                } else if ( global_disallows & SLAP_DISALLOW_AUX_WO_CR ) {
                                        k = -1;
+                                       snprintf( textbuf, textlen, 
+                                               "class '%s' not allowed by any content rule",
+                                               oc->soc_cname.bv_val );
                                } else {
                                        k = 0;  
                                }
 
                                if( k == -1 ) {
-                                       snprintf( textbuf, textlen, 
-                                               "content rule '%s' does not allow class '%s'",
-                                               ldap_contentrule2name( &cr->scr_crule ),
-                                               oc->soc_cname.bv_val );
-
                                        Debug( LDAP_DEBUG_ANY,
                                                "Entry (%s): %s\n",
                                                e->e_dn, textbuf, 0 );
 
                                        rc = LDAP_OBJECT_CLASS_VIOLATION;
-                                       goto leave;
+                                       goto done;
                                }
                        }
 
@@ -416,7 +423,7 @@ got_soc:
                                        e->e_dn, textbuf, 0 );
 
                                rc = LDAP_OBJECT_CLASS_VIOLATION;
-                               goto leave;
+                               goto done;
                        }
 
                        if( oc == slap_schema.si_oc_extensibleObject ) {
@@ -428,7 +435,7 @@ got_soc:
        if( extensible ) {
                *text = NULL;
                rc = LDAP_SUCCESS;
-               goto leave;
+               goto done;
        }
 
        /* check that each attr in the entry is allowed by some oc */
@@ -469,12 +476,12 @@ got_soc:
                            "Entry (%s), %s\n",
                            e->e_dn, textbuf, 0 );
 
-                       goto leave;
+                       goto done;
                }
        }
 
        *text = NULL;
-leave:
+done:
        slap_sl_free( socs, op->o_tmpmemctx );
        return rc;
 }
@@ -565,6 +572,10 @@ int oc_check_allowed(
        for ( i = 0; socs[i]; i++ ) {
                /* if we know about the oc */
                ObjectClass     *oc = socs[i];
+               /* extensibleObject allows all */
+               if ( oc == slap_schema.si_oc_extensibleObject ) {
+                       return LDAP_SUCCESS;
+               }
                if ( oc != NULL && oc->soc_kind != LDAP_SCHEMA_ABSTRACT &&
                        ( sc == NULL || oc->soc_kind == LDAP_SCHEMA_AUXILIARY ))
                {
@@ -845,9 +856,9 @@ entry_naming_check(
                        break;
                }
 
-               rc = value_find_ex( desc, SLAP_MR_VALUE_OF_ASSERTION_SYNTAX|
+               rc = attr_valfind( attr, SLAP_MR_VALUE_OF_ASSERTION_SYNTAX|
                        SLAP_MR_ATTRIBUTE_VALUE_NORMALIZED_MATCH,
-                       attr->a_nvals, &ava->la_value, NULL );
+                       &ava->la_value, NULL, NULL );
 
                if( rc != 0 ) {
                        switch( rc ) {