From 01f7a7466bf70b552b69d6f46380ee139fbfa529 Mon Sep 17 00:00:00 2001 From: Howard Chu Date: Fri, 24 Oct 2003 05:58:42 +0000 Subject: [PATCH] SLAPI fix - no-op when slapi_plugins_used == 0 --- servers/slapd/acl.c | 4 +- servers/slapd/add.c | 34 ++++---- servers/slapd/backend.c | 40 +++++----- servers/slapd/bind.c | 159 +++++++++++++++++++------------------ servers/slapd/compare.c | 49 ++++++------ servers/slapd/config.c | 5 ++ servers/slapd/connection.c | 18 +++-- servers/slapd/delete.c | 45 +++++------ servers/slapd/modify.c | 72 +++++++++-------- servers/slapd/modrdn.c | 53 ++++++------- servers/slapd/operation.c | 8 +- servers/slapd/proto-slap.h | 3 + servers/slapd/result.c | 80 ++++++++++--------- servers/slapd/search.c | 52 ++++++------ servers/slapd/syncrepl.c | 6 +- 15 files changed, 329 insertions(+), 299 deletions(-) diff --git a/servers/slapd/acl.c b/servers/slapd/acl.c index 17f4459e00..7673e27d12 100644 --- a/servers/slapd/acl.c +++ b/servers/slapd/acl.c @@ -178,8 +178,8 @@ access_allowed( } #ifdef LDAP_SLAPI - ret = slapi_x_access_allowed( op, e, desc, val, access, state ); - if ( ret == 0 ) { + if ( op->o_pb && + !slapi_x_access_allowed( op, e, desc, val, access, state )) { /* ACL plugin denied access */ goto done; } diff --git a/servers/slapd/add.c b/servers/slapd/add.c index cc18e3fc3c..323fd00bdc 100644 --- a/servers/slapd/add.c +++ b/servers/slapd/add.c @@ -231,7 +231,7 @@ do_add( Operation *op, SlapReply *rs ) } #ifdef LDAP_SLAPI - initAddPlugin( op, &dn, e, manageDSAit ); + if ( op->o_pb ) initAddPlugin( op, &dn, e, manageDSAit ); #endif /* LDAP_SLAPI */ /* @@ -290,10 +290,12 @@ do_add( Operation *op, SlapReply *rs ) * Call the preoperation plugin here, because the entry * will actually contain something. */ - rs->sr_err = doPreAddPluginFNs( op ); - if ( rs->sr_err != LDAP_SUCCESS ) { - /* plugin will have sent result */ - goto done; + if ( op->o_pb ) { + rs->sr_err = doPreAddPluginFNs( op ); + if ( rs->sr_err != LDAP_SUCCESS ) { + /* plugin will have sent result */ + goto done; + } } #endif /* LDAP_SLAPI */ @@ -317,10 +319,12 @@ do_add( Operation *op, SlapReply *rs ) * SLAPI_ADD_ENTRY will be empty, but this may be acceptable * on replicas (for now, it involves the minimum code intrusion). */ - rs->sr_err = doPreAddPluginFNs( op ); - if ( rs->sr_err != LDAP_SUCCESS ) { - /* plugin will have sent result */ - goto done; + if ( op->o_pb ) { + rs->sr_err = doPreAddPluginFNs( op ); + if ( rs->sr_err != LDAP_SUCCESS ) { + /* plugin will have sent result */ + goto done; + } } #endif /* LDAP_SLAPI */ @@ -349,10 +353,12 @@ do_add( Operation *op, SlapReply *rs ) } } else { #ifdef LDAP_SLAPI - rs->sr_err = doPreAddPluginFNs( op ); - if ( rs->sr_err != LDAP_SUCCESS ) { - /* plugin will have sent result */ - goto done; + if ( op->o_pb ) { + rs->sr_err = doPreAddPluginFNs( op ); + if ( rs->sr_err != LDAP_SUCCESS ) { + /* plugin will have sent result */ + goto done; + } } #endif #ifdef NEW_LOGGING @@ -366,7 +372,7 @@ do_add( Operation *op, SlapReply *rs ) } #ifdef LDAP_SLAPI - doPostAddPluginFNs( op ); + if ( op->o_pb ) doPostAddPluginFNs( op ); #endif /* LDAP_SLAPI */ done: diff --git a/servers/slapd/backend.c b/servers/slapd/backend.c index ad58b26b63..8edb10f2d6 100644 --- a/servers/slapd/backend.c +++ b/servers/slapd/backend.c @@ -745,31 +745,29 @@ int backend_unbind( Operation *op, SlapReply *rs ) { int i; -#if defined( LDAP_SLAPI ) - Slapi_PBlock *pb = op->o_pb; - - int rc; - slapi_x_pblock_set_operation( pb, op ); -#endif /* defined( LDAP_SLAPI ) */ for ( i = 0; i < nbackends; i++ ) { #if defined( LDAP_SLAPI ) - slapi_pblock_set( pb, SLAPI_BACKEND, (void *)&backends[i] ); - rc = doPluginFNs( &backends[i], SLAPI_PLUGIN_PRE_UNBIND_FN, - (Slapi_PBlock *)pb ); - if ( rc < 0 ) { - /* - * A preoperation plugin failure will abort the - * entire operation. - */ + if ( op->o_pb ) { + int rc; + if ( i == 0 ) slapi_x_pblock_set_operation( op->o_pb, op ); + slapi_pblock_set( op->o_pb, SLAPI_BACKEND, (void *)&backends[i] ); + rc = doPluginFNs( &backends[i], SLAPI_PLUGIN_PRE_UNBIND_FN, + (Slapi_PBlock *)op->o_pb ); + if ( rc < 0 ) { + /* + * A preoperation plugin failure will abort the + * entire operation. + */ #ifdef NEW_LOGGING - LDAP_LOG( OPERATION, INFO, "do_bind: Unbind preoperation plugin " - "failed\n", 0, 0, 0); + LDAP_LOG( OPERATION, INFO, "do_bind: Unbind preoperation plugin " + "failed\n", 0, 0, 0); #else - Debug(LDAP_DEBUG_TRACE, "do_bind: Unbind preoperation plugin " - "failed.\n", 0, 0, 0); + Debug(LDAP_DEBUG_TRACE, "do_bind: Unbind preoperation plugin " + "failed.\n", 0, 0, 0); #endif - return 0; + return 0; + } } #endif /* defined( LDAP_SLAPI ) */ @@ -779,8 +777,8 @@ backend_unbind( Operation *op, SlapReply *rs ) } #if defined( LDAP_SLAPI ) - if ( doPluginFNs( &backends[i], SLAPI_PLUGIN_POST_UNBIND_FN, - (Slapi_PBlock *)pb ) < 0 ) { + if ( op->o_pb && doPluginFNs( &backends[i], SLAPI_PLUGIN_POST_UNBIND_FN, + (Slapi_PBlock *)op->o_pb ) < 0 ) { #ifdef NEW_LOGGING LDAP_LOG( OPERATION, INFO, "do_unbind: Unbind postoperation plugins " "failed\n", 0, 0, 0); diff --git a/servers/slapd/bind.c b/servers/slapd/bind.c index b4095cf56b..a500dd37cb 100644 --- a/servers/slapd/bind.c +++ b/servers/slapd/bind.c @@ -45,11 +45,6 @@ do_bind( ber_tag_t tag; Backend *be = NULL; -#ifdef LDAP_SLAPI - Slapi_PBlock *pb = op->o_pb; - int rc; -#endif - #ifdef NEW_LOGGING LDAP_LOG( OPERATION, ENTRY, "do_bind: conn %d\n", op->o_connid, 0, 0 ); #else @@ -357,6 +352,7 @@ do_bind( } #ifdef LDAP_SLAPI +#define pb op->o_pb /* * Normally post-operation plugins are called only after the * backend operation. Because the front-end performs SASL @@ -364,12 +360,14 @@ do_bind( * exception to call the post-operation plugins after a * SASL bind. */ - slapi_x_pblock_set_operation( pb, op ); - slapi_pblock_set( pb, SLAPI_BIND_TARGET, (void *)dn.bv_val ); - slapi_pblock_set( pb, SLAPI_BIND_METHOD, (void *)method ); - slapi_pblock_set( pb, SLAPI_BIND_CREDENTIALS, (void *)&op->orb_cred ); - slapi_pblock_set( pb, SLAPI_MANAGEDSAIT, (void *)(0) ); - (void) doPluginFNs( op->o_bd, SLAPI_PLUGIN_POST_BIND_FN, pb ); + if ( pb ) { + slapi_x_pblock_set_operation( pb, op ); + slapi_pblock_set( pb, SLAPI_BIND_TARGET, (void *)dn.bv_val ); + slapi_pblock_set( pb, SLAPI_BIND_METHOD, (void *)method ); + slapi_pblock_set( pb, SLAPI_BIND_CREDENTIALS, (void *)&op->orb_cred ); + slapi_pblock_set( pb, SLAPI_MANAGEDSAIT, (void *)(0) ); + (void) doPluginFNs( op->o_bd, SLAPI_PLUGIN_POST_BIND_FN, pb ); + } #endif /* LDAP_SLAPI */ ldap_pvt_thread_mutex_unlock( &op->o_conn->c_mutex ); @@ -522,84 +520,87 @@ do_bind( } #if defined( LDAP_SLAPI ) - slapi_x_pblock_set_operation( pb, op ); - slapi_pblock_set( pb, SLAPI_BIND_TARGET, (void *)dn.bv_val ); - slapi_pblock_set( pb, SLAPI_BIND_METHOD, (void *)method ); - slapi_pblock_set( pb, SLAPI_BIND_CREDENTIALS, (void *)&op->orb_cred ); - slapi_pblock_set( pb, SLAPI_MANAGEDSAIT, (void *)(0) ); - slapi_pblock_set( pb, SLAPI_CONN_DN, (void *)(0) ); + if ( pb ) { + int rc; + slapi_x_pblock_set_operation( pb, op ); + slapi_pblock_set( pb, SLAPI_BIND_TARGET, (void *)dn.bv_val ); + slapi_pblock_set( pb, SLAPI_BIND_METHOD, (void *)method ); + slapi_pblock_set( pb, SLAPI_BIND_CREDENTIALS, (void *)&op->orb_cred ); + slapi_pblock_set( pb, SLAPI_MANAGEDSAIT, (void *)(0) ); + slapi_pblock_set( pb, SLAPI_CONN_DN, (void *)(0) ); - rc = doPluginFNs( op->o_bd, SLAPI_PLUGIN_PRE_BIND_FN, pb ); + rc = doPluginFNs( op->o_bd, SLAPI_PLUGIN_PRE_BIND_FN, pb ); #ifdef NEW_LOGGING - LDAP_LOG( OPERATION, INFO, - "do_bind: Bind preoperation plugin returned %d\n", - rs->sr_err, 0, 0); + LDAP_LOG( OPERATION, INFO, + "do_bind: Bind preoperation plugin returned %d\n", + rs->sr_err, 0, 0); #else - Debug(LDAP_DEBUG_TRACE, - "do_bind: Bind preoperation plugin returned %d.\n", - rs->sr_err, 0, 0); + Debug(LDAP_DEBUG_TRACE, + "do_bind: Bind preoperation plugin returned %d.\n", + rs->sr_err, 0, 0); #endif - switch ( rc ) { - case SLAPI_BIND_SUCCESS: - /* Continue with backend processing */ - break; - case SLAPI_BIND_FAIL: - /* Failure, server sends result */ - rs->sr_err = LDAP_INVALID_CREDENTIALS; - send_ldap_result( op, rs ); - goto cleanup; - break; - case SLAPI_BIND_ANONYMOUS: - /* SLAPI_BIND_ANONYMOUS is undocumented XXX */ - default: - /* Authoritative, plugin sent result, or no plugins called. */ - if ( slapi_pblock_get( op->o_pb, SLAPI_RESULT_CODE, - (void *)&rs->sr_err) != 0 ) - { - rs->sr_err = LDAP_OTHER; - } + switch ( rc ) { + case SLAPI_BIND_SUCCESS: + /* Continue with backend processing */ + break; + case SLAPI_BIND_FAIL: + /* Failure, server sends result */ + rs->sr_err = LDAP_INVALID_CREDENTIALS; + send_ldap_result( op, rs ); + goto cleanup; + break; + case SLAPI_BIND_ANONYMOUS: + /* SLAPI_BIND_ANONYMOUS is undocumented XXX */ + default: + /* Authoritative, plugin sent result, or no plugins called. */ + if ( slapi_pblock_get( op->o_pb, SLAPI_RESULT_CODE, + (void *)&rs->sr_err) != 0 ) + { + rs->sr_err = LDAP_OTHER; + } - op->orb_edn.bv_val = NULL; - op->orb_edn.bv_len = 0; + op->orb_edn.bv_val = NULL; + op->orb_edn.bv_len = 0; - if ( rs->sr_err == LDAP_SUCCESS ) { - slapi_pblock_get( pb, SLAPI_CONN_DN, (void *)&op->orb_edn.bv_val ); - if ( op->orb_edn.bv_val == NULL ) { - if ( rc == 1 ) { - /* No plugins were called; continue. */ - break; + if ( rs->sr_err == LDAP_SUCCESS ) { + slapi_pblock_get( pb, SLAPI_CONN_DN, (void *)&op->orb_edn.bv_val ); + if ( op->orb_edn.bv_val == NULL ) { + if ( rc == 1 ) { + /* No plugins were called; continue. */ + break; + } + } else { + op->orb_edn.bv_len = strlen( op->orb_edn.bv_val ); } - } else { - op->orb_edn.bv_len = strlen( op->orb_edn.bv_val ); - } - rs->sr_err = dnPrettyNormal( NULL, &op->orb_edn, - &op->o_req_dn, &op->o_req_ndn, op->o_tmpmemctx ); - ldap_pvt_thread_mutex_lock( &op->o_conn->c_mutex ); - ber_dupbv(&op->o_conn->c_dn, &op->o_req_dn); - ber_dupbv(&op->o_conn->c_ndn, &op->o_req_ndn); - op->o_tmpfree( op->o_req_dn.bv_val, op->o_tmpmemctx ); - op->o_req_dn.bv_val = NULL; - op->o_req_dn.bv_len = 0; - op->o_tmpfree( op->o_req_ndn.bv_val, op->o_tmpmemctx ); - op->o_req_ndn.bv_val = NULL; - op->o_req_ndn.bv_len = 0; - if ( op->o_conn->c_dn.bv_len != 0 ) { - ber_len_t max = sockbuf_max_incoming_auth; - ber_sockbuf_ctrl( op->o_conn->c_sb, - LBER_SB_OPT_SET_MAX_INCOMING, &max ); + rs->sr_err = dnPrettyNormal( NULL, &op->orb_edn, + &op->o_req_dn, &op->o_req_ndn, op->o_tmpmemctx ); + ldap_pvt_thread_mutex_lock( &op->o_conn->c_mutex ); + ber_dupbv(&op->o_conn->c_dn, &op->o_req_dn); + ber_dupbv(&op->o_conn->c_ndn, &op->o_req_ndn); + op->o_tmpfree( op->o_req_dn.bv_val, op->o_tmpmemctx ); + op->o_req_dn.bv_val = NULL; + op->o_req_dn.bv_len = 0; + op->o_tmpfree( op->o_req_ndn.bv_val, op->o_tmpmemctx ); + op->o_req_ndn.bv_val = NULL; + op->o_req_ndn.bv_len = 0; + if ( op->o_conn->c_dn.bv_len != 0 ) { + ber_len_t max = sockbuf_max_incoming_auth; + ber_sockbuf_ctrl( op->o_conn->c_sb, + LBER_SB_OPT_SET_MAX_INCOMING, &max ); + } + /* log authorization identity */ + Statslog( LDAP_DEBUG_STATS, + "conn=%lu op=%lu BIND dn=\"%s\" mech=simple (SLAPI) ssf=0\n", + op->o_connid, op->o_opid, + op->o_conn->c_dn.bv_val ? op->o_conn->c_dn.bv_val : "", + 0, 0 ); + ldap_pvt_thread_mutex_unlock( &op->o_conn->c_mutex ); } - /* log authorization identity */ - Statslog( LDAP_DEBUG_STATS, - "conn=%lu op=%lu BIND dn=\"%s\" mech=simple (SLAPI) ssf=0\n", - op->o_connid, op->o_opid, - op->o_conn->c_dn.bv_val ? op->o_conn->c_dn.bv_val : "", - 0, 0 ); - ldap_pvt_thread_mutex_unlock( &op->o_conn->c_mutex ); + goto cleanup; + break; } - goto cleanup; - break; } #endif /* defined( LDAP_SLAPI ) */ @@ -660,7 +661,7 @@ do_bind( } #if defined( LDAP_SLAPI ) - if ( doPluginFNs( op->o_bd, SLAPI_PLUGIN_POST_BIND_FN, pb ) < 0 ) { + if ( pb && doPluginFNs( op->o_bd, SLAPI_PLUGIN_POST_BIND_FN, pb ) < 0 ) { #ifdef NEW_LOGGING LDAP_LOG( OPERATION, INFO, "do_bind: Bind postoperation plugins failed\n", diff --git a/servers/slapd/compare.c b/servers/slapd/compare.c index 7615323a5c..bac553cb1b 100644 --- a/servers/slapd/compare.c +++ b/servers/slapd/compare.c @@ -45,10 +45,6 @@ do_compare( AttributeAssertion ava = { NULL, { 0, NULL } }; int manageDSAit; -#ifdef LDAP_SLAPI - Slapi_PBlock *pb = op->o_pb; -#endif - ava.aa_desc = NULL; #ifdef NEW_LOGGING @@ -254,30 +250,33 @@ do_compare( ava.aa_desc->ad_cname.bv_val, 0 ); #if defined( LDAP_SLAPI ) - slapi_x_pblock_set_operation( pb, op ); - slapi_pblock_set( pb, SLAPI_COMPARE_TARGET, (void *)dn.bv_val ); - slapi_pblock_set( pb, SLAPI_MANAGEDSAIT, (void *)manageDSAit ); - slapi_pblock_set( pb, SLAPI_COMPARE_TYPE, (void *)desc.bv_val ); - slapi_pblock_set( pb, SLAPI_COMPARE_VALUE, (void *)&value ); - - rs->sr_err = doPluginFNs( op->o_bd, SLAPI_PLUGIN_PRE_COMPARE_FN, pb ); - if ( rs->sr_err < 0 ) { - /* - * A preoperation plugin failure will abort the - * entire operation. - */ +#define pb op->o_pb + if ( pb ) { + slapi_x_pblock_set_operation( pb, op ); + slapi_pblock_set( pb, SLAPI_COMPARE_TARGET, (void *)dn.bv_val ); + slapi_pblock_set( pb, SLAPI_MANAGEDSAIT, (void *)manageDSAit ); + slapi_pblock_set( pb, SLAPI_COMPARE_TYPE, (void *)desc.bv_val ); + slapi_pblock_set( pb, SLAPI_COMPARE_VALUE, (void *)&value ); + + rs->sr_err = doPluginFNs( op->o_bd, SLAPI_PLUGIN_PRE_COMPARE_FN, pb ); + if ( rs->sr_err < 0 ) { + /* + * A preoperation plugin failure will abort the + * entire operation. + */ #ifdef NEW_LOGGING - LDAP_LOG( OPERATION, INFO, "do_compare: compare preoperation plugin " - "failed\n", 0, 0, 0); + LDAP_LOG( OPERATION, INFO, "do_compare: compare preoperation plugin " + "failed\n", 0, 0, 0); #else - Debug(LDAP_DEBUG_TRACE, "do_compare: compare preoperation plugin " - "failed.\n", 0, 0, 0); + Debug(LDAP_DEBUG_TRACE, "do_compare: compare preoperation plugin " + "failed.\n", 0, 0, 0); #endif - if ( ( slapi_pblock_get( op->o_pb, SLAPI_RESULT_CODE, (void *)&rs->sr_err ) != 0 ) || - rs->sr_err == LDAP_SUCCESS ) { - rs->sr_err = LDAP_OTHER; + if ( ( slapi_pblock_get( op->o_pb, SLAPI_RESULT_CODE, (void *)&rs->sr_err ) != 0 ) || + rs->sr_err == LDAP_SUCCESS ) { + rs->sr_err = LDAP_OTHER; + } + goto cleanup; } - goto cleanup; } #endif /* defined( LDAP_SLAPI ) */ @@ -290,7 +289,7 @@ do_compare( } #if defined( LDAP_SLAPI ) - if ( doPluginFNs( op->o_bd, SLAPI_PLUGIN_POST_COMPARE_FN, pb ) < 0 ) { + if ( pb && doPluginFNs( op->o_bd, SLAPI_PLUGIN_POST_COMPARE_FN, pb ) < 0 ) { #ifdef NEW_LOGGING LDAP_LOG( OPERATION, INFO, "do_compare: compare postoperation plugins " "failed\n", 0, 0, 0 ); diff --git a/servers/slapd/config.c b/servers/slapd/config.c index 52c9e0a601..3245fe986c 100644 --- a/servers/slapd/config.c +++ b/servers/slapd/config.c @@ -73,6 +73,10 @@ char *strtok_quote_ptr; int use_reverse_lookup = 0; +#ifdef LDAP_SLAPI +int slapi_plugins_used = 0; +#endif + static char *fp_getline(FILE *fp, int *lineno); static void fp_getline_init(int *lineno); static int fp_parse_line(int lineno, char *line); @@ -2404,6 +2408,7 @@ read_config( const char *fname, int depth ) != LDAP_SUCCESS ) { return( 1 ); } + slapi_plugins_used++; #else /* !defined( LDAP_SLAPI ) */ #ifdef NEW_LOGGING diff --git a/servers/slapd/connection.c b/servers/slapd/connection.c index 4adf478e25..35543fab40 100644 --- a/servers/slapd/connection.c +++ b/servers/slapd/connection.c @@ -39,16 +39,18 @@ static unsigned long conn_nextid = 0; #define SLAP_C_ACTIVE 0x02 /* one or more threads */ #define SLAP_C_BINDING 0x03 /* binding */ #define SLAP_C_CLOSING 0x04 /* closing */ +#define SLAP_C_CLIENT 0x05 /* outbound client conn */ const char * connection_state2str( int state ) { switch( state ) { - case SLAP_C_INVALID: return "!"; - case SLAP_C_INACTIVE: return "|"; - case SLAP_C_ACTIVE: return ""; + case SLAP_C_INVALID: return "!"; + case SLAP_C_INACTIVE: return "|"; + case SLAP_C_ACTIVE: return ""; case SLAP_C_BINDING: return "B"; - case SLAP_C_CLOSING: return "C"; + case SLAP_C_CLOSING: return "C"; + case SLAP_C_CLIENT: return "L"; } return "?"; @@ -463,7 +465,9 @@ long connection_init( ldap_pvt_thread_cond_init( &c->c_write_cv ); #ifdef LDAP_SLAPI - slapi_x_create_object_extensions( SLAPI_X_EXT_CONNECTION, c ); + if ( slapi_plugins_used ) { + slapi_x_create_object_extensions( SLAPI_X_EXT_CONNECTION, c ); + } #endif c->c_struct_state = SLAP_C_UNUSED; @@ -687,7 +691,9 @@ connection_destroy( Connection *c ) #ifdef LDAP_SLAPI /* call destructors, then constructors; avoids unnecessary allocation */ - slapi_x_clear_object_extensions( SLAPI_X_EXT_CONNECTION, c ); + if ( slapi_plugins_used ) { + slapi_x_clear_object_extensions( SLAPI_X_EXT_CONNECTION, c ); + } #endif } diff --git a/servers/slapd/delete.c b/servers/slapd/delete.c index 5af628095e..cebb526c04 100644 --- a/servers/slapd/delete.c +++ b/servers/slapd/delete.c @@ -40,10 +40,6 @@ do_delete( struct berval dn = { 0, NULL }; int manageDSAit; -#ifdef LDAP_SLAPI - Slapi_PBlock *pb = op->o_pb; -#endif - #ifdef NEW_LOGGING LDAP_LOG( OPERATION, ENTRY, "do_delete: conn %d\n", op->o_connid, 0, 0 ); @@ -158,28 +154,31 @@ do_delete( } #if defined( LDAP_SLAPI ) - slapi_x_pblock_set_operation( pb, op ); - slapi_pblock_set( pb, SLAPI_DELETE_TARGET, (void *)dn.bv_val ); - slapi_pblock_set( pb, SLAPI_MANAGEDSAIT, (void *)manageDSAit ); - - rs->sr_err = doPluginFNs( op->o_bd, SLAPI_PLUGIN_PRE_DELETE_FN, pb ); - if ( rs->sr_err < 0 ) { - /* - * A preoperation plugin failure will abort the - * entire operation. - */ +#define pb op->o_pb + if ( pb ) { + slapi_x_pblock_set_operation( pb, op ); + slapi_pblock_set( pb, SLAPI_DELETE_TARGET, (void *)dn.bv_val ); + slapi_pblock_set( pb, SLAPI_MANAGEDSAIT, (void *)manageDSAit ); + + rs->sr_err = doPluginFNs( op->o_bd, SLAPI_PLUGIN_PRE_DELETE_FN, pb ); + if ( rs->sr_err < 0 ) { + /* + * A preoperation plugin failure will abort the + * entire operation. + */ #ifdef NEW_LOGGING - LDAP_LOG( OPERATION, INFO, "do_delete: delete preoperation plugin " - "failed\n", 0, 0, 0 ); + LDAP_LOG( OPERATION, INFO, "do_delete: delete preoperation plugin " + "failed\n", 0, 0, 0 ); #else - Debug (LDAP_DEBUG_TRACE, "do_delete: delete preoperation plugin failed.\n", - 0, 0, 0); + Debug (LDAP_DEBUG_TRACE, "do_delete: delete preoperation plugin failed.\n", + 0, 0, 0); #endif - if ( ( slapi_pblock_get( op->o_pb, SLAPI_RESULT_CODE, (void *)&rs->sr_err ) != 0 ) || - rs->sr_err == LDAP_SUCCESS ) { - rs->sr_err = LDAP_OTHER; + if ( ( slapi_pblock_get( pb, SLAPI_RESULT_CODE, (void *)&rs->sr_err ) != 0 ) || + rs->sr_err == LDAP_SUCCESS ) { + rs->sr_err = LDAP_OTHER; + } + goto cleanup; } - goto cleanup; } #endif /* defined( LDAP_SLAPI ) */ @@ -245,7 +244,7 @@ do_delete( } #if defined( LDAP_SLAPI ) - if ( doPluginFNs( op->o_bd, SLAPI_PLUGIN_POST_DELETE_FN, pb ) < 0) { + if ( pb && doPluginFNs( op->o_bd, SLAPI_PLUGIN_POST_DELETE_FN, pb ) < 0) { #ifdef NEW_LOGGING LDAP_LOG( OPERATION, INFO, "do_delete: delete postoperation plugins " "failed\n", 0, 0, 0 ); diff --git a/servers/slapd/modify.c b/servers/slapd/modify.c index 89a818fd33..a120a3690a 100644 --- a/servers/slapd/modify.c +++ b/servers/slapd/modify.c @@ -47,7 +47,6 @@ do_modify( #endif #ifdef LDAP_SLAPI LDAPMod **modv = NULL; - Slapi_PBlock *pb = op->o_pb; #endif int manageDSAit; int increment = 0; @@ -383,44 +382,47 @@ do_modify( } #if defined( LDAP_SLAPI ) - slapi_x_pblock_set_operation( pb, op ); - slapi_pblock_set( pb, SLAPI_MODIFY_TARGET, (void *)dn.bv_val ); - slapi_pblock_set( pb, SLAPI_MANAGEDSAIT, (void *)manageDSAit ); - modv = slapi_x_modifications2ldapmods( &modlist ); - slapi_pblock_set( pb, SLAPI_MODIFY_MODS, (void *)modv ); - - rs->sr_err = doPluginFNs( op->o_bd, SLAPI_PLUGIN_PRE_MODIFY_FN, pb ); - if ( rs->sr_err < 0 ) { - /* - * A preoperation plugin failure will abort the - * entire operation. - */ +#define pb op->o_pb + if ( pb ) { + slapi_x_pblock_set_operation( pb, op ); + slapi_pblock_set( pb, SLAPI_MODIFY_TARGET, (void *)dn.bv_val ); + slapi_pblock_set( pb, SLAPI_MANAGEDSAIT, (void *)manageDSAit ); + modv = slapi_x_modifications2ldapmods( &modlist ); + slapi_pblock_set( pb, SLAPI_MODIFY_MODS, (void *)modv ); + + rs->sr_err = doPluginFNs( op->o_bd, SLAPI_PLUGIN_PRE_MODIFY_FN, pb ); + if ( rs->sr_err < 0 ) { + /* + * A preoperation plugin failure will abort the + * entire operation. + */ #ifdef NEW_LOGGING - LDAP_LOG( OPERATION, INFO, "do_modify: modify preoperation plugin " - "failed\n", 0, 0, 0 ); + LDAP_LOG( OPERATION, INFO, "do_modify: modify preoperation plugin " + "failed\n", 0, 0, 0 ); #else - Debug(LDAP_DEBUG_TRACE, "do_modify: modify preoperation plugin failed.\n", - 0, 0, 0); + Debug(LDAP_DEBUG_TRACE, "do_modify: modify preoperation plugin failed.\n", + 0, 0, 0); #endif - if ( ( slapi_pblock_get( op->o_pb, SLAPI_RESULT_CODE, (void *)&rs->sr_err ) != 0 ) || - rs->sr_err == LDAP_SUCCESS ) { - rs->sr_err = LDAP_OTHER; + if ( ( slapi_pblock_get( op->o_pb, SLAPI_RESULT_CODE, (void *)&rs->sr_err ) != 0 ) || + rs->sr_err == LDAP_SUCCESS ) { + rs->sr_err = LDAP_OTHER; + } + slapi_x_free_ldapmods( modv ); + modv = NULL; + goto cleanup; } - slapi_x_free_ldapmods( modv ); - modv = NULL; - goto cleanup; - } - /* - * It's possible that the preoperation plugin changed the - * modification array, so we need to convert it back to - * a Modification list. - * - * Calling slapi_x_modifications2ldapmods() destroyed modlist so - * we don't need to free it. - */ - slapi_pblock_get( pb, SLAPI_MODIFY_MODS, (void **)&modv ); - modlist = slapi_x_ldapmods2modifications( modv ); + /* + * It's possible that the preoperation plugin changed the + * modification array, so we need to convert it back to + * a Modification list. + * + * Calling slapi_x_modifications2ldapmods() destroyed modlist so + * we don't need to free it. + */ + slapi_pblock_get( pb, SLAPI_MODIFY_MODS, (void **)&modv ); + modlist = slapi_x_ldapmods2modifications( modv ); + } /* * NB: it is valid for the plugin to return no modifications @@ -532,7 +534,7 @@ do_modify( #if defined( LDAP_SLAPI ) } /* modlist != NULL */ - if ( doPluginFNs( op->o_bd, SLAPI_PLUGIN_POST_MODIFY_FN, pb ) < 0 ) { + if ( pb && doPluginFNs( op->o_bd, SLAPI_PLUGIN_POST_MODIFY_FN, pb ) < 0 ) { #ifdef NEW_LOGGING LDAP_LOG( OPERATION, INFO, "do_modify: modify postoperation plugins " "failed\n", 0, 0, 0 ); diff --git a/servers/slapd/modrdn.c b/servers/slapd/modrdn.c index 0d27035499..f63aca9d56 100644 --- a/servers/slapd/modrdn.c +++ b/servers/slapd/modrdn.c @@ -60,10 +60,6 @@ do_modrdn( ber_len_t length; int manageDSAit; -#ifdef LDAP_SLAPI - Slapi_PBlock *pb = op->o_pb; -#endif - #ifdef NEW_LOGGING LDAP_LOG( OPERATION, ENTRY, "do_modrdn: begin\n", 0, 0, 0 ); #else @@ -315,32 +311,35 @@ do_modrdn( } #if defined( LDAP_SLAPI ) - slapi_x_pblock_set_operation( pb, op ); - slapi_pblock_set( pb, SLAPI_MODRDN_TARGET, (void *)dn.bv_val ); - slapi_pblock_set( pb, SLAPI_MODRDN_NEWRDN, (void *)newrdn.bv_val ); - slapi_pblock_set( pb, SLAPI_MODRDN_NEWSUPERIOR, - (void *)newSuperior.bv_val ); - slapi_pblock_set( pb, SLAPI_MODRDN_DELOLDRDN, (void *)deloldrdn ); - slapi_pblock_set( pb, SLAPI_MANAGEDSAIT, (void *)manageDSAit ); - - rs->sr_err = doPluginFNs( op->o_bd, SLAPI_PLUGIN_PRE_MODRDN_FN, pb ); - if ( rs->sr_err < 0 ) { - /* - * A preoperation plugin failure will abort the - * entire operation. - */ +#define pb op->o_pb + if ( pb ) { + slapi_x_pblock_set_operation( pb, op ); + slapi_pblock_set( pb, SLAPI_MODRDN_TARGET, (void *)dn.bv_val ); + slapi_pblock_set( pb, SLAPI_MODRDN_NEWRDN, (void *)newrdn.bv_val ); + slapi_pblock_set( pb, SLAPI_MODRDN_NEWSUPERIOR, + (void *)newSuperior.bv_val ); + slapi_pblock_set( pb, SLAPI_MODRDN_DELOLDRDN, (void *)deloldrdn ); + slapi_pblock_set( pb, SLAPI_MANAGEDSAIT, (void *)manageDSAit ); + + rs->sr_err = doPluginFNs( op->o_bd, SLAPI_PLUGIN_PRE_MODRDN_FN, pb ); + if ( rs->sr_err < 0 ) { + /* + * A preoperation plugin failure will abort the + * entire operation. + */ #ifdef NEW_LOGGING - LDAP_LOG( OPERATION, INFO, "do_modrdn: modrdn preoperation plugin " - "failed\n", 0, 0, 0 ); + LDAP_LOG( OPERATION, INFO, "do_modrdn: modrdn preoperation plugin " + "failed\n", 0, 0, 0 ); #else - Debug(LDAP_DEBUG_TRACE, "do_modrdn: modrdn preoperation plugin " - "failed.\n", 0, 0, 0); + Debug(LDAP_DEBUG_TRACE, "do_modrdn: modrdn preoperation plugin " + "failed.\n", 0, 0, 0); #endif - if ( ( slapi_pblock_get( pb, SLAPI_RESULT_CODE, (void *)&rs->sr_err ) != 0 ) || - rs->sr_err == LDAP_SUCCESS ) { - rs->sr_err = LDAP_OTHER; + if ( ( slapi_pblock_get( pb, SLAPI_RESULT_CODE, (void *)&rs->sr_err ) != 0 ) || + rs->sr_err == LDAP_SUCCESS ) { + rs->sr_err = LDAP_OTHER; + } + goto cleanup; } - goto cleanup; } #endif /* defined( LDAP_SLAPI ) */ @@ -399,7 +398,7 @@ do_modrdn( } #if defined( LDAP_SLAPI ) - if ( doPluginFNs( op->o_bd, SLAPI_PLUGIN_POST_MODRDN_FN, pb ) < 0 ) { + if ( pb && doPluginFNs( op->o_bd, SLAPI_PLUGIN_POST_MODRDN_FN, pb ) < 0 ) { #ifdef NEW_LOGGING LDAP_LOG( OPERATION, INFO, "do_modrdn: modrdn postoperation plugins " "failed\n", 0, 0, 0 ); diff --git a/servers/slapd/operation.c b/servers/slapd/operation.c index cb08e60eee..c144c19cfc 100644 --- a/servers/slapd/operation.c +++ b/servers/slapd/operation.c @@ -81,8 +81,8 @@ slap_op_free( Operation *op ) #if defined( LDAP_SLAPI ) if ( op->o_pb != NULL ) { slapi_pblock_destroy( (Slapi_PBlock *)op->o_pb ); + slapi_x_free_object_extensions( SLAPI_X_EXT_OPERATION, op ); } - slapi_x_free_object_extensions( SLAPI_X_EXT_OPERATION, op ); #endif /* defined( LDAP_SLAPI ) */ memset( op, 0, sizeof(Operation) ); @@ -119,8 +119,10 @@ slap_op_alloc( op->o_res_ber = NULL; #if defined( LDAP_SLAPI ) - op->o_pb = slapi_pblock_new(); - slapi_x_create_object_extensions( SLAPI_X_EXT_OPERATION, op ); + if ( slapi_plugins_used ) { + op->o_pb = slapi_pblock_new(); + slapi_x_create_object_extensions( SLAPI_X_EXT_OPERATION, op ); + } #endif /* defined( LDAP_SLAPI ) */ return( op ); diff --git a/servers/slapd/proto-slap.h b/servers/slapd/proto-slap.h index 930ef949d5..5e9184c230 100644 --- a/servers/slapd/proto-slap.h +++ b/servers/slapd/proto-slap.h @@ -304,6 +304,9 @@ LDAP_SLAPD_F (int) get_supported_controls LDAP_P (( char ***ctrloidsp, slap_mask LDAP_SLAPD_F (int) read_config LDAP_P(( const char *fname, int depth )); LDAP_SLAPD_F (void) config_destroy LDAP_P ((void)); LDAP_SLAPD_F (char **) str2clist LDAP_P(( char ***, char *, const char * )); +#ifdef LDAP_SLAPI +LDAP_SLAPD_V (int) slapi_plugins_used; +#endif /* * connection.c diff --git a/servers/slapd/result.c b/servers/slapd/result.c index 3beff2f438..d05dd42132 100644 --- a/servers/slapd/result.c +++ b/servers/slapd/result.c @@ -371,9 +371,11 @@ send_ldap_response( } #ifdef LDAP_SLAPI - slapi_pblock_set( op->o_pb, SLAPI_RESULT_CODE, (void *)rs->sr_err ); - slapi_pblock_set( op->o_pb, SLAPI_RESULT_MATCHED, (void *)rs->sr_matched ); - slapi_pblock_set( op->o_pb, SLAPI_RESULT_TEXT, (void *)rs->sr_text ); + if ( op->o_pb ) { + slapi_pblock_set( op->o_pb, SLAPI_RESULT_CODE, (void *)rs->sr_err ); + slapi_pblock_set( op->o_pb, SLAPI_RESULT_MATCHED, (void *)rs->sr_matched ); + slapi_pblock_set( op->o_pb, SLAPI_RESULT_TEXT, (void *)rs->sr_text ); + } #endif /* LDAP_SLAPI */ ldap_pvt_thread_mutex_lock( &num_sent_mutex ); @@ -493,12 +495,14 @@ slap_send_ldap_result( Operation *op, SlapReply *rs ) * should just set SLAPI_RESULT_CODE rather than sending a * result if they wish to change the result. */ - slapi_x_pblock_set_operation( op->o_pb, op ); - slapi_pblock_set( op->o_pb, SLAPI_RESULT_CODE, (void *)rs->sr_err ); - slapi_pblock_set( op->o_pb, SLAPI_RESULT_TEXT, (void *)rs->sr_text ); - slapi_pblock_set( op->o_pb, SLAPI_RESULT_MATCHED, (void *)rs->sr_matched ); + if ( op->o_pb ) { + slapi_x_pblock_set_operation( op->o_pb, op ); + slapi_pblock_set( op->o_pb, SLAPI_RESULT_CODE, (void *)rs->sr_err ); + slapi_pblock_set( op->o_pb, SLAPI_RESULT_TEXT, (void *)rs->sr_text ); + slapi_pblock_set( op->o_pb, SLAPI_RESULT_MATCHED, (void *)rs->sr_matched ); - (void) doPluginFNs( op->o_bd, SLAPI_PLUGIN_PRE_RESULT_FN, op->o_pb ); + (void) doPluginFNs( op->o_bd, SLAPI_PLUGIN_PRE_RESULT_FN, op->o_pb ); + } #endif /* LDAP_SLAPI */ if ( op->o_protocol < LDAP_VERSION3 ) { @@ -1069,38 +1073,40 @@ slap_send_search_entry( Operation *op, SlapReply *rs ) * First, setup the computed attribute context that is * passed to all plugins. */ - ctx.cac_pb = op->o_pb; - ctx.cac_attrs = rs->sr_attrs; - ctx.cac_attrsonly = op->ors_attrsonly; - ctx.cac_userattrs = userattrs; - ctx.cac_opattrs = opattrs; - ctx.cac_acl_state = acl_state; - ctx.cac_private = (void *)ber; + if ( op->o_pb ) { + ctx.cac_pb = op->o_pb; + ctx.cac_attrs = rs->sr_attrs; + ctx.cac_attrsonly = op->ors_attrsonly; + ctx.cac_userattrs = userattrs; + ctx.cac_opattrs = opattrs; + ctx.cac_acl_state = acl_state; + ctx.cac_private = (void *)ber; - /* - * For each client requested attribute, call the plugins. - */ - if ( rs->sr_attrs != NULL ) { - for ( anp = rs->sr_attrs; anp->an_name.bv_val != NULL; anp++ ) { - rc = compute_evaluator( &ctx, anp->an_name.bv_val, - rs->sr_entry, slapi_x_compute_output_ber ); - if ( rc == 1 ) { - break; - } - } - } else { /* - * Technically we shouldn't be returning operational attributes - * when the user requested only user attributes. We'll let the - * plugin decide whether to be naughty or not. + * For each client requested attribute, call the plugins. */ - rc = compute_evaluator( &ctx, "*", - rs->sr_entry, slapi_x_compute_output_ber ); - } - if ( rc == 1 ) { - if ( op->o_res_ber == NULL ) ber_free_buf( ber ); - send_ldap_error( op, rs, LDAP_OTHER, "computed attribute error" ); - goto error_return; + if ( rs->sr_attrs != NULL ) { + for ( anp = rs->sr_attrs; anp->an_name.bv_val != NULL; anp++ ) { + rc = compute_evaluator( &ctx, anp->an_name.bv_val, + rs->sr_entry, slapi_x_compute_output_ber ); + if ( rc == 1 ) { + break; + } + } + } else { + /* + * Technically we shouldn't be returning operational attributes + * when the user requested only user attributes. We'll let the + * plugin decide whether to be naughty or not. + */ + rc = compute_evaluator( &ctx, "*", + rs->sr_entry, slapi_x_compute_output_ber ); + } + if ( rc == 1 ) { + if ( op->o_res_ber == NULL ) ber_free_buf( ber ); + send_ldap_error( op, rs, LDAP_OTHER, "computed attribute error" ); + goto error_return; + } } #endif /* LDAP_SLAPI */ diff --git a/servers/slapd/search.c b/servers/slapd/search.c index 71c8960611..39ca34f4b1 100644 --- a/servers/slapd/search.c +++ b/servers/slapd/search.c @@ -245,7 +245,8 @@ do_search( manageDSAit = get_manageDSAit( op ); - if ( op->ors_scope == LDAP_SCOPE_BASE ) { + /* fake while loop to allow breaking out */ + while ( op->ors_scope == LDAP_SCOPE_BASE ) { Entry *entry = NULL; if ( op->o_req_ndn.bv_len == 0 ) { @@ -262,16 +263,15 @@ do_search( } #ifdef LDAP_SLAPI - attrs = anlist2charray( op, op->ors_attrs ); - initSearchPlugin( op, attrs, manageDSAit ); - rs->sr_err = doPreSearchPluginFNs( op ); - if ( rs->sr_err == LDAP_SUCCESS ) { + if ( op->o_pb ) { + attrs = anlist2charray( op, op->ors_attrs ); + initSearchPlugin( op, attrs, manageDSAit ); + rs->sr_err = doPreSearchPluginFNs( op ); + if ( rs->sr_err ) break; doSearchRewriteFNs( op ); -#endif /* LDAP_SLAPI */ - rs->sr_err = root_dse_info( op->o_conn, &entry, &rs->sr_text ); -#ifdef LDAP_SLAPI } #endif /* LDAP_SLAPI */ + rs->sr_err = root_dse_info( op->o_conn, &entry, &rs->sr_text ); } else if ( bvmatch( &op->o_req_ndn, &global_schemandn ) ) { /* check restrictions */ @@ -281,22 +281,21 @@ do_search( } #ifdef LDAP_SLAPI - attrs = anlist2charray( op, op->ors_attrs ); - initSearchPlugin( op, attrs, manageDSAit ); - rs->sr_err = doPreSearchPluginFNs( op ); - if ( rs->sr_err == LDAP_SUCCESS ) { + if ( op->o_pb ) { + attrs = anlist2charray( op, op->ors_attrs ); + initSearchPlugin( op, attrs, manageDSAit ); + rs->sr_err = doPreSearchPluginFNs( op ); + if ( rs->sr_err ) break; doSearchRewriteFNs( op ); -#endif /* LDAP_SLAPI */ - rs->sr_err = schema_info( &entry, &rs->sr_text ); -#ifdef LDAP_SLAPI } #endif /* LDAP_SLAPI */ + rs->sr_err = schema_info( &entry, &rs->sr_text ); } if( rs->sr_err != LDAP_SUCCESS ) { send_ldap_result( op, rs ); #ifdef LDAP_SLAPI - doPostSearchPluginFNs( op ); + if ( op->o_pb ) doPostSearchPluginFNs( op ); #endif /* LDAP_SLAPI */ goto return_results; @@ -314,10 +313,11 @@ do_search( rs->sr_err = LDAP_SUCCESS; send_ldap_result( op, rs ); #ifdef LDAP_SLAPI - doPostSearchPluginFNs( op ); + if ( op->o_pb ) doPostSearchPluginFNs( op ); #endif /* LDAP_SLAPI */ goto return_results; } + break; } if( !op->o_req_ndn.bv_len && default_search_nbase.bv_len ) { @@ -372,14 +372,16 @@ do_search( } #ifdef LDAP_SLAPI - attrs = anlist2charray( op, op->ors_attrs ); - initSearchPlugin( op, attrs, manageDSAit ); - rs->sr_err = doPreSearchPluginFNs( op ); - if ( rs->sr_err != LDAP_SUCCESS ) { - goto return_results; - } + if ( op->o_pb ) { + attrs = anlist2charray( op, op->ors_attrs ); + initSearchPlugin( op, attrs, manageDSAit ); + rs->sr_err = doPreSearchPluginFNs( op ); + if ( rs->sr_err != LDAP_SUCCESS ) { + goto return_results; + } - doSearchRewriteFNs( op ); + doSearchRewriteFNs( op ); + } #endif /* LDAP_SLAPI */ /* actually do the search and send the result(s) */ @@ -391,7 +393,7 @@ do_search( } #ifdef LDAP_SLAPI - doPostSearchPluginFNs( op ); + if ( op->o_pb ) doPostSearchPluginFNs( op ); #endif /* LDAP_SLAPI */ return_results:; diff --git a/servers/slapd/syncrepl.c b/servers/slapd/syncrepl.c index 8167f73bed..33fdeecf27 100644 --- a/servers/slapd/syncrepl.c +++ b/servers/slapd/syncrepl.c @@ -398,8 +398,10 @@ do_syncrepl( op.o_conn = &conn; op.o_connid = op.o_conn->c_connid; #if defined( LDAP_SLAPI ) - op.o_pb = slapi_pblock_new(); - slapi_x_create_object_extensions( SLAPI_X_EXT_OPERATION, &op ); + if ( slapi_plugins_used ) { + op.o_pb = slapi_pblock_new(); + slapi_x_create_object_extensions( SLAPI_X_EXT_OPERATION, &op ); + } #endif /* defined( LDAP_SLAPI ) */ /* get syncrepl cookie of shadow replica from subentry */ -- 2.39.5