X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=servers%2Fslapd%2Fbackend.c;h=7e0dbce7d99f9a6648ecc5c486afdb40fd6ea947;hb=e841247c9086053d774d66e4fbb058d0ead706b2;hp=aad928e616e75e7dd6064cfd316110777b228dcc;hpb=e701d9b88532667a91b2735991fc11e2fee20147;p=openldap diff --git a/servers/slapd/backend.c b/servers/slapd/backend.c index aad928e616..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 @@ -449,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 ); @@ -500,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; @@ -611,6 +612,9 @@ backend_db_init( nbackends--; } } else { + if ( !bi->bi_nDB ) { + backend_init_controls( bi ); + } bi->bi_nDB++; } return( be ); @@ -945,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 @@ -999,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 ); @@ -1019,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 ) {