]> git.sur5r.net Git - openldap/blobdiff - servers/slapd/backend.c
fix previous commit (ITS#5819)
[openldap] / servers / slapd / backend.c
index fb92cf6f7f211943b69171fa1b0ff1b1d3dda294..df66dd0f0992f9e23b7fee5cce8c272a64ba9cb1 100644 (file)
@@ -261,15 +261,13 @@ int backend_startup(Backend *be)
                                return rc;
                        }
                }
-               /* append global access controls */
-               acl_append( &be->be_acl, frontendDB->be_acl, -1 );
 
                return backend_startup_one( be, &cr );
        }
 
        /* open frontend, if required */
        if ( frontendDB->bd_info->bi_db_open ) {
-               rc = frontendDB->bd_info->bi_db_open( frontendDB, NULL );
+               rc = frontendDB->bd_info->bi_db_open( frontendDB, &cr );
                if ( rc != 0 ) {
                        Debug( LDAP_DEBUG_ANY,
                                "backend_startup: bi_db_open(frontend) failed! (%d)\n",
@@ -310,8 +308,6 @@ int backend_startup(Backend *be)
                                "has no suffix\n",
                                i, be->bd_info->bi_type, 0 );
                }
-               /* append global access controls */
-               acl_append( &be->be_acl, frontendDB->be_acl, -1 );
 
                rc = backend_startup_one( be, &cr );
 
@@ -349,11 +345,13 @@ int backend_shutdown( Backend *be )
                }
 
                if ( be->bd_info->bi_db_close ) {
-                       be->bd_info->bi_db_close( be, NULL );
+                       rc = be->bd_info->bi_db_close( be, NULL );
+                       if ( rc ) return rc;
                }
 
                if( be->bd_info->bi_close ) {
-                       be->bd_info->bi_close( be->bd_info );
+                       rc = be->bd_info->bi_close( be->bd_info );
+                       if ( rc ) return rc;
                }
 
                return 0;
@@ -451,7 +449,7 @@ void backend_destroy_one( BackendDB *bd, int dynamic )
        if ( !BER_BVISNULL( &bd->be_rootpw ) ) {
                free( bd->be_rootpw.bv_val );
        }
-       acl_destroy( bd->be_acl, frontendDB->be_acl );
+       acl_destroy( bd->be_acl );
        limits_destroy( bd->be_limits );
        if ( !BER_BVISNULL( &bd->be_update_ndn ) ) {
                ch_free( bd->be_update_ndn.bv_val );
@@ -502,7 +500,8 @@ int backend_destroy(void)
                if ( !BER_BVISNULL( &bd->be_rootpw ) ) {
                        free( bd->be_rootpw.bv_val );
                }
-               acl_destroy( bd->be_acl, frontendDB->be_acl );
+               acl_destroy( bd->be_acl );
+               frontendDB = NULL;
        }
 
        return 0;
@@ -585,7 +584,7 @@ backend_db_init(
        }
 
        be->bd_info = bi;
-       be->bd_orig = be;
+       be->bd_self = be;
 
        be->be_def_limit = frontendDB->be_def_limit;
        be->be_dfltaccess = frontendDB->be_dfltaccess;
@@ -594,8 +593,7 @@ backend_db_init(
        be->be_requires = frontendDB->be_requires;
        be->be_ssf_set = frontendDB->be_ssf_set;
 
-       be->be_pcl_mutexp = &be->be_pcl_mutex;
-       ldap_pvt_thread_mutex_init( be->be_pcl_mutexp );
+       ldap_pvt_thread_mutex_init( &be->be_pcl_mutex );
 
        /* assign a default depth limit for alias deref */
        be->be_max_deref_depth = SLAPD_DEFAULT_MAXDEREFDEPTH; 
@@ -946,6 +944,14 @@ backend_check_controls(
 
                        case LDAP_COMPARE_FALSE:
                                if ( !op->o_bd->be_ctrls[cid] && (*ctrls)->ldctl_iscritical ) {
+#ifdef SLAP_CONTROL_X_WHATFAILED
+                                       if ( get_whatFailed( op ) ) {
+                                               char *oids[ 2 ];
+                                               oids[ 0 ] = (*ctrls)->ldctl_oid;
+                                               oids[ 1 ] = NULL;
+                                               slap_ctrl_whatFailed_add( op, rs, oids );
+                                       }
+#endif
                                        /* RFC 4511 allows unavailableCriticalExtension to be
                                         * returned when the server is unwilling to perform
                                         * an operation extended by a recognized critical
@@ -1359,7 +1365,8 @@ fe_acl_group(
 
        if ( oex && ((OpExtraDB *)oex)->oe_db )
                op->o_bd = ((OpExtraDB *)oex)->oe_db;
-       else
+
+       if ( !op->o_bd || !SLAP_DBHIDDEN( op->o_bd ))
                op->o_bd = select_backend( gr_ndn, 0 );
 
        for ( g = op->o_groups; g; g = g->ga_next ) {
@@ -1495,7 +1502,7 @@ fe_acl_group(
                                                {
                                                        rc = 0;
                                                }
-                                               filter_free_x( op, filter );
+                                               filter_free_x( op, filter, 1 );
                                        }
 loopit:
                                        ldap_free_urldesc( ludp );
@@ -1573,10 +1580,7 @@ backend_group(
                return SLAPD_ABANDON;
        }
 
-       if ( op->o_bd && SLAP_ISOVERLAY( op->o_bd ))
-               oex.oe_db = op->o_bd->bd_orig;
-       else
-               oex.oe_db = op->o_bd;
+       oex.oe_db = op->o_bd;
        oex.oe.oe_key = (void *)backend_group;
        LDAP_SLIST_INSERT_HEAD(&op->o_extra, &oex.oe, oe_next);
 
@@ -1614,7 +1618,8 @@ fe_acl_attribute(
 
        if ( oex && ((OpExtraDB *)oex)->oe_db )
                op->o_bd = ((OpExtraDB *)oex)->oe_db;
-       else
+
+       if ( !op->o_bd || !SLAP_DBHIDDEN( op->o_bd ))
                op->o_bd = select_backend( edn, 0 );
 
        if ( target && dn_match( &target->e_nname, edn ) ) {
@@ -1737,10 +1742,7 @@ backend_attribute(
        BackendDB *be_orig;
        OpExtraDB       oex;
 
-       if ( op->o_bd && SLAP_ISOVERLAY( op->o_bd ))
-               oex.oe_db = op->o_bd->bd_orig;
-       else
-               oex.oe_db = op->o_bd;
+       oex.oe_db = op->o_bd;
        oex.oe.oe_key = (void *)backend_attribute;
        LDAP_SLIST_INSERT_HEAD(&op->o_extra, &oex.oe, oe_next);
 
@@ -1775,10 +1777,7 @@ backend_access(
        assert( edn != NULL );
        assert( access > ACL_NONE );
 
-       if ( op->o_bd ) {
-               if ( SLAP_ISOVERLAY( op->o_bd ))
-                       op->o_bd = op->o_bd->bd_orig;
-       } else {
+       if ( !op->o_bd ) {
                op->o_bd = select_backend( edn, 0 );
        }
 
@@ -1906,11 +1905,12 @@ fe_aux_operational(
        }
 
        /* Let the overlays have a chance at this */
-       if ( oex && ((OpExtraDB *)oex)->oe_db ) {
+       if ( oex && ((OpExtraDB *)oex)->oe_db )
                op->o_bd = ((OpExtraDB *)oex)->oe_db;
-       } else {
+
+       if ( !op->o_bd || !SLAP_DBHIDDEN( op->o_bd ))
                op->o_bd = select_backend( &op->o_req_ndn, 0 );
-       }
+
        if ( op->o_bd != NULL && !be_match( op->o_bd, frontendDB ) &&
                ( SLAP_OPATTRS( rs->sr_attr_flags ) || rs->sr_attrs ) &&
                op->o_bd->be_operational != NULL )
@@ -1928,10 +1928,7 @@ int backend_operational( Operation *op, SlapReply *rs )
        BackendDB *be_orig;
        OpExtraDB       oex;
 
-       if ( op->o_bd && SLAP_ISOVERLAY( op->o_bd ))
-               oex.oe_db = op->o_bd->bd_orig;
-       else
-               oex.oe_db = op->o_bd;
+       oex.oe_db = op->o_bd;
        oex.oe.oe_key = (void *)backend_operational;
        LDAP_SLIST_INSERT_HEAD(&op->o_extra, &oex.oe, oe_next);