From: Pierangelo Masarati Date: Sat, 29 Jan 2005 17:58:48 +0000 (+0000) Subject: use direct access instead of string comparison to check supported controls X-Git-Tag: OPENLDAP_REL_ENG_2_3_BP~224 X-Git-Url: https://git.sur5r.net/?a=commitdiff_plain;h=d0b804c439774fb0e59b666ebffe7271d4f5ae85;p=openldap use direct access instead of string comparison to check supported controls --- diff --git a/servers/slapd/back-relay/init.c b/servers/slapd/back-relay/init.c index d5a3d9ac15..d3b19e6d49 100644 --- a/servers/slapd/back-relay/init.c +++ b/servers/slapd/back-relay/init.c @@ -21,6 +21,7 @@ #include "portable.h" #include +#include #include "slap.h" #include "back-relay.h" @@ -102,15 +103,11 @@ relay_back_db_open( Backend *be ) assert( ri->ri_bd ); /* inherit controls */ - if ( ri->ri_bd->be_controls ) { - be->be_controls = ldap_charray_dup( ri->ri_bd->be_controls ); - } + AC_MEMCPY( be->be_ctrls, ri->ri_bd->be_ctrls, sizeof( be->be_ctrls ) ); } else { /* inherit all? */ - if ( frontendDB->be_controls ) { - be->be_controls = ldap_charray_dup( frontendDB->be_controls ); - } + AC_MEMCPY( be->be_ctrls, frontendDB->be_ctrls, sizeof( be->be_ctrls ) ); } return 0; diff --git a/servers/slapd/backend.c b/servers/slapd/backend.c index 084a825688..8de9c895e2 100644 --- a/servers/slapd/backend.c +++ b/servers/slapd/backend.c @@ -65,6 +65,32 @@ BackendDB *backendDB = NULL; ldap_pvt_thread_pool_t syncrepl_pool; int syncrepl_pool_max = SLAP_MAX_SYNCREPL_THREADS; +static int +backend_init_controls( BackendInfo *bi ) +{ + if ( bi->bi_controls ) { + int i; + + for ( i = 0; bi->bi_controls[ i ]; i++ ) { + int cid; + + if ( slap_find_control_id( bi->bi_controls[ i ], &cid ) + == LDAP_CONTROL_NOT_FOUND ) + { + if ( !( slapMode & SLAP_TOOL_MODE ) ) { + assert( 0 ); + } + + return -1; + } + + bi->bi_ctrls[ cid ] = 1; + } + } + + return 0; +} + int backend_init(void) { int rc = -1; @@ -132,12 +158,15 @@ int backend_add(BackendInfo *aBackendInfo) return -1; } - if ((rc = aBackendInfo->bi_init(aBackendInfo)) != 0) { + rc = aBackendInfo->bi_init(aBackendInfo); + if ( rc != 0) { Debug( LDAP_DEBUG_ANY, "backend_add: initialization for type \"%s\" failed\n", aBackendInfo->bi_type, 0, 0 ); return rc; - } + } + + (void)backend_init_controls( aBackendInfo ); /* now add the backend type to the Backend Info List */ { @@ -175,25 +204,27 @@ int backend_startup_one(Backend *be) LDAP_TAILQ_INIT( be->be_pending_csn_list ); /* back-relay takes care of itself; so may do other */ - if ( be->be_controls == NULL ) { + if ( be->be_ctrls[ SLAP_MAX_CIDS ] == 0 ) { if ( overlay_is_over( be ) ) { bi = ((slap_overinfo *)be->bd_info->bi_private)->oi_orig; } if ( bi->bi_controls ) { - be->be_controls = ldap_charray_dup( bi->bi_controls ); + AC_MEMCPY( be->be_ctrls, bi->bi_ctrls, sizeof( be->be_ctrls ) ); } + + be->be_ctrls[ SLAP_MAX_CIDS ] = 1; } Debug( LDAP_DEBUG_TRACE, - "backend_startup: starting \"%s\"\n", + "backend_startup_one: starting \"%s\"\n", be->be_suffix ? be->be_suffix[0].bv_val : "(unknown)", 0, 0 ); if ( be->bd_info->bi_db_open ) { rc = be->bd_info->bi_db_open( be ); if ( rc != 0 ) { Debug( LDAP_DEBUG_ANY, - "backend_startup: bi_db_open failed! (%d)\n", + "backend_startup_one: bi_db_open failed! (%d)\n", rc, 0, 0 ); } } @@ -205,19 +236,16 @@ int backend_startup_one(Backend *be) } if ( bi->bi_controls ) { - if ( be->be_controls == NULL ) { - be->be_controls = ldap_charray_dup( bi->bi_controls ); + if ( be->be_ctrls[ SLAP_MAX_CIDS ] == 0 ) { + AC_MEMCPY( be->be_ctrls, bi->bi_ctrls, sizeof( be->be_ctrls ) ); + be->be_ctrls[ SLAP_MAX_CIDS ] = 1; } else { int i; - /* maybe not efficient, but it's startup and few dozens of controls... */ - for ( i = 0; bi->bi_controls[ i ]; i++ ) { - if ( !ldap_charray_inlist( be->be_controls, bi->bi_controls[ i ] ) ) { - rc = ldap_charray_add( &be->be_controls, bi->bi_controls[ i ] ); - if ( rc != 0 ) { - break; - } + for ( i = 0; i < SLAP_MAX_CIDS; i++ ) { + if ( bi->bi_ctrls[ i ] ) { + be->be_ctrls[ i ] = 1; } } } @@ -273,8 +301,7 @@ int backend_startup(Backend *be) } if( backendInfo[i].bi_open ) { - rc = backendInfo[i].bi_open( - &backendInfo[i] ); + rc = backendInfo[i].bi_open( &backendInfo[i] ); if ( rc != 0 ) { Debug( LDAP_DEBUG_ANY, "backend_startup: bi_open %d failed!\n", @@ -282,6 +309,8 @@ int backend_startup(Backend *be) return rc; } } + + (void)backend_init_controls( &backendInfo[i] ); } ldap_pvt_thread_mutex_init( &slapd_rq.rq_mutex ); @@ -448,9 +477,6 @@ int backend_destroy(void) free( bd->be_rootpw.bv_val ); } acl_destroy( bd->be_acl, frontendDB->be_acl ); - if ( bd->be_controls ) { - ldap_charray_free( bd->be_controls ); - } } free( backendDB ); @@ -860,8 +886,7 @@ backend_check_controls( } } else if ( !slap_global_control( op, (*ctrls)->ldctl_oid ) && - !ldap_charray_inlist( op->o_bd->be_controls, - (*ctrls)->ldctl_oid ) ) + !op->o_bd->be_ctrls[ cid ] ) { /* Per RFC 2251 (and LDAPBIS discussions), if the control * is recognized and appropriate for the operation (which diff --git a/servers/slapd/backover.c b/servers/slapd/backover.c index 4f0082b0d6..0ab6beb4ca 100644 --- a/servers/slapd/backover.c +++ b/servers/slapd/backover.c @@ -472,6 +472,11 @@ overlay_register_control( BackendDB *be, const char *oid ) { int rc = 0; int gotit = 0; + int cid; + + if ( slap_find_control_id( oid, &cid ) == LDAP_CONTROL_NOT_FOUND ) { + return -1; + } if ( SLAP_DBFLAGS( be ) & SLAP_DBFLAG_GLOBAL_OVERLAY ) { int i; @@ -484,23 +489,13 @@ overlay_register_control( BackendDB *be, const char *oid ) gotit = 1; } - if ( bd->be_controls == NULL || - !ldap_charray_inlist( bd->be_controls, oid ) ) - { - rc = ldap_charray_add( &bd->be_controls, oid ); - if ( rc ) { - break; - } - } + bd->be_ctrls[ cid ] = 1; } } - if ( rc == 0 && !gotit && !ldap_charray_inlist( be->be_controls, oid ) ) { - rc = ldap_charray_add( &be->be_controls, oid ); - if ( rc ) { - return rc; - } + if ( rc == 0 && !gotit ) { + be->be_ctrls[ cid ] = 1; } return rc; diff --git a/servers/slapd/frontend.c b/servers/slapd/frontend.c index bf9635b875..f9cfe6f466 100644 --- a/servers/slapd/frontend.c +++ b/servers/slapd/frontend.c @@ -86,8 +86,25 @@ frontend_init( void ) frontendDB->bd_info->bi_type = "frontend"; /* known controls */ - frontendDB->bd_info->bi_controls = slap_known_controls; - frontendDB->be_controls = ldap_charray_dup( slap_known_controls ); + if ( slap_known_controls ) { + int i; + + frontendDB->bd_info->bi_controls = slap_known_controls; + + for ( i = 0; slap_known_controls[ i ]; i++ ) { + int cid; + + if ( slap_find_control_id( slap_known_controls[ i ], &cid ) + == LDAP_CONTROL_NOT_FOUND ) + { + assert( 0 ); + return -1; + } + + frontendDB->bd_info->bi_ctrls[ cid ] = 1; + frontendDB->be_ctrls[ cid ] = 1; + } + } /* calls */ frontendDB->bd_info->bi_op_abandon = fe_op_abandon; diff --git a/servers/slapd/slap.h b/servers/slapd/slap.h index 08566e4730..df92358c07 100644 --- a/servers/slapd/slap.h +++ b/servers/slapd/slap.h @@ -1527,6 +1527,10 @@ typedef struct syncinfo_s { LDAP_TAILQ_HEAD( be_pcl, slap_csn_entry ); +#ifndef SLAP_MAX_CIDS +#define SLAP_MAX_CIDS 32 /* Maximum number of supported controls */ +#endif + struct slap_backend_db { BackendInfo *bd_info; /* pointer to shared backend info */ @@ -1568,7 +1572,12 @@ struct slap_backend_db { /* NOTE: this stores a duplicate of the control OIDs as listed * in bd_info->bi_controls at database startup; later on, * controls may be added run-time, e.g. by overlays */ +#if 0 char **be_controls; +#endif + /* note: set to 0 if the database does not support the control; + * be_ctrls[SLAP_MAX_CIDS] is set to 1 if initialized */ + char be_ctrls[SLAP_MAX_CIDS + 1]; #define be_connection_init bd_info->bi_connection_init #define be_connection_destroy bd_info->bi_connection_destroy @@ -2017,7 +2026,8 @@ struct slap_backend_info { #define SLAP_NOLASTMODCMD(be) (SLAP_BFLAGS(be) & SLAP_BFLAG_NOLASTMODCMD) #define SLAP_LASTMODCMD(be) (!SLAP_NOLASTMODCMD(be)) - char **bi_controls; /* supported controls */ + char **bi_controls; /* supported controls */ + char bi_ctrls[SLAP_MAX_CIDS + 1]; unsigned int bi_nDB; /* number of databases of this type */ void *bi_private; /* anything the backend type needs */ @@ -2103,10 +2113,6 @@ typedef struct slap_gacl { char ga_ndn[1]; } GroupAssertion; -#ifndef SLAP_MAX_CIDS -#define SLAP_MAX_CIDS 32 /* Maximum number of supported controls */ -#endif - struct slap_control_ids { int sc_assert; int sc_preRead;