X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fbackend.c;h=7e0dbce7d99f9a6648ecc5c486afdb40fd6ea947;hb=e841247c9086053d774d66e4fbb058d0ead706b2;hp=3754a258f20af6203dbce3bc5d295c85632fd207;hpb=4e22081e02abd6f280fa2c44fab97b884fb52222;p=openldap diff --git a/servers/slapd/backend.c b/servers/slapd/backend.c index 3754a258f2..7e0dbce7d9 100644 --- a/servers/slapd/backend.c +++ b/servers/slapd/backend.c @@ -2,7 +2,7 @@ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 1998-2008 The OpenLDAP Foundation. + * Copyright 1998-2009 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -261,8 +261,6 @@ 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 ); } @@ -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 ); @@ -453,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 ); @@ -504,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; @@ -615,6 +612,9 @@ backend_db_init( nbackends--; } } else { + if ( !bi->bi_nDB ) { + backend_init_controls( bi ); + } bi->bi_nDB++; } return( be ); @@ -949,7 +949,9 @@ backend_check_controls( if ( !op->o_bd->be_ctrls[cid] && (*ctrls)->ldctl_iscritical ) { #ifdef SLAP_CONTROL_X_WHATFAILED if ( get_whatFailed( op ) ) { - char *oids[ 2 ] = { (*ctrls)->ldctl_oid, NULL }; + char *oids[ 2 ]; + oids[ 0 ] = (*ctrls)->ldctl_oid; + oids[ 1 ] = NULL; slap_ctrl_whatFailed_add( op, rs, oids ); } #endif @@ -1003,13 +1005,19 @@ backend_check_restrictions( slap_mask_t requires; slap_mask_t opflag; slap_mask_t exopflag = 0; - slap_ssf_set_t *ssf; + slap_ssf_set_t ssfs, *ssf; int updateop = 0; int starttls = 0; int session = 0; + restrictops = frontendDB->be_restrictops; + requires = frontendDB->be_requires; + ssfs = frontendDB->be_ssf_set; + ssf = &ssfs; + if ( op->o_bd ) { - int rc = SLAP_CB_CONTINUE; + slap_ssf_t *fssf, *bssf; + int rc = SLAP_CB_CONTINUE, i; if ( op->o_bd->be_chk_controls ) { rc = ( *op->o_bd->be_chk_controls )( op, rs ); @@ -1023,14 +1031,13 @@ backend_check_restrictions( return rs->sr_err; } - restrictops = op->o_bd->be_restrictops; - requires = op->o_bd->be_requires; - ssf = &op->o_bd->be_ssf_set; - - } else { - restrictops = frontendDB->be_restrictops; - requires = frontendDB->be_requires; - ssf = &frontendDB->be_ssf_set; + restrictops |= op->o_bd->be_restrictops; + requires |= op->o_bd->be_requires; + bssf = &op->o_bd->be_ssf_set.sss_ssf; + fssf = &ssfs.sss_ssf; + for ( i=0; io_tag ) {