]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/oc.c
Sync with HEAD (need to update CHANGES)
[openldap] / servers / slapd / oc.c
index a721a35d6f24be7afe38a54d2be743c22c46c11a..2772d72711fb99387701221a70809497753c91c4 100644 (file)
@@ -57,7 +57,7 @@ int is_object_subclass(
 int is_entry_objectclass(
        Entry*  e,
        ObjectClass *oc,
-       int set_flags )
+       unsigned flags )
 {
        /*
         * set_flags should only be true if oc is one of operational
@@ -67,15 +67,16 @@ int is_entry_objectclass(
 
        Attribute *attr;
        struct berval *bv;
-       AttributeDescription *objectClass = slap_schema.si_ad_objectClass;
 
-       assert(!( e == NULL || oc == NULL ));
+       assert( !( e == NULL || oc == NULL ) );
+       assert( ( flags & SLAP_OCF_MASK ) != SLAP_OCF_MASK );
 
        if( e == NULL || oc == NULL ) {
                return 0;
        }
 
-       if( set_flags && ( e->e_ocflags & SLAP_OC__END )) {
+       if( flags == SLAP_OCF_SET_FLAGS && ( e->e_ocflags & SLAP_OC__END ) )
+       {
                /* flags are set, use them */
                return (e->e_ocflags & oc->soc_flags & SLAP_OC__MASK) != 0;
        }
@@ -83,7 +84,7 @@ int is_entry_objectclass(
        /*
         * find objectClass attribute
         */
-       attr = attr_find(e->e_attrs, objectClass);
+       attr = attr_find( e->e_attrs, slap_schema.si_ad_objectClass );
        if( attr == NULL ) {
                /* no objectClass attribute */
                Debug( LDAP_DEBUG_ANY, "is_entry_objectclass(\"%s\", \"%s\") "
@@ -97,19 +98,30 @@ int is_entry_objectclass(
        for( bv=attr->a_vals; bv->bv_val; bv++ ) {
                ObjectClass *objectClass = oc_bvfind( bv );
 
-               if ( !set_flags && objectClass == oc ) {
-                       return 1;
+               if ( objectClass == NULL ) {
+                       /* FIXME: is this acceptable? */
+                       continue;
                }
-               
-               if ( objectClass != NULL ) {
-                       e->e_ocflags |= objectClass->soc_flags;
+
+               if ( !( flags & SLAP_OCF_SET_FLAGS ) ) {
+                       if ( objectClass == oc ) {
+                               return 1;
+                       }
+
+                       if ( ( flags & SLAP_OCF_CHECK_SUP )
+                               && is_object_subclass( oc, objectClass ) )
+                       {
+                               return 1;
+                       }
                }
+               
+               e->e_ocflags |= objectClass->soc_flags;
        }
 
        /* mark flags as set */
        e->e_ocflags |= SLAP_OC__END;
 
-       return (e->e_ocflags & oc->soc_flags & SLAP_OC__MASK) != 0;
+       return ( e->e_ocflags & oc->soc_flags & SLAP_OC__MASK ) != 0;
 }
 
 
@@ -215,7 +227,9 @@ oc_bvfind_undef( struct berval *ocname )
        AC_MEMCPY( oc->soc_cname.bv_val, ocname->bv_val, ocname->bv_len );
 
        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 );
+       ldap_pvt_thread_mutex_unlock( &oc_undef_mutex );
 
        return oc;
 }