/* we need asyncmeta_getconn() not send result even on error,
* because we want to intercept the error and make it
* invalidCredentials */
- mc = asyncmeta_getconn( op, rs, candidates, NULL, LDAP_BACK_BIND_DONTSEND, 1 );
+ mc = asyncmeta_getconn( op, rs, candidates, NULL, 1 );
if ( !mc ) {
Debug(LDAP_DEBUG_ANY,
"%s asyncmeta_back_bind: no target " "for dn \"%s\" (%d%s%s).\n",
op->o_log_prefix, candidate, (void *)mc );
rc = asyncmeta_init_one_conn( op, rs, mc, candidate,
- LDAP_BACK_CONN_ISPRIV( mc ), LDAP_BACK_DONTSEND, 0 );
+ LDAP_BACK_CONN_ISPRIV( mc ), 0 );
switch ( rc ) {
case LDAP_SUCCESS:
asyncmeta_reset_msc(NULL, mc, candidate, 0, buf);
rc = asyncmeta_init_one_conn( op, rs, mc, candidate,
- LDAP_BACK_CONN_ISPRIV( mc ), LDAP_BACK_DONTSEND, 0 );
+ LDAP_BACK_CONN_ISPRIV( mc ), 0 );
ldap_pvt_thread_mutex_unlock( &mc->mc_om_mutex );
}
asyncmeta_reset_msc(NULL, mc, candidate, 0, __FUNCTION__);
rc = asyncmeta_init_one_conn( op, rs, mc, candidate,
- LDAP_BACK_CONN_ISPRIV( mc ), LDAP_BACK_DONTSEND, 0 );
+ LDAP_BACK_CONN_ISPRIV( mc ), 0 );
if (rs->sr_err != LDAP_SUCCESS) {
asyncmeta_reset_msc(NULL, mc, candidate, 0, __FUNCTION__);
a_metaconn_t *mc,
int candidate,
int ispriv,
- ldap_back_send_t sendok,
int dolock)
{
a_metainfo_t *mi = mc->mc_info;
int version;
a_dncookie dc;
int isauthz = ( candidate == mc->mc_authz_target );
- int do_return = 0;
#ifdef HAVE_TLS
int is_ldaps = 0;
int do_start_tls = 0;
rs->sr_text = "Target is quarantined";
Debug( LDAP_DEBUG_ANY, "%s asyncmeta_init_one_conn: Target is quarantined\n",
op->o_log_prefix );
- if ( op->o_conn && ( sendok & LDAP_BACK_SENDERR ) ) {
- send_ldap_result( op, rs );
- }
return rs->sr_err;
}
}
{
assert( msc->msc_ld != NULL );
rs->sr_err = LDAP_SUCCESS;
- do_return = 1;
+ return rs->sr_err;
} else if ( META_BACK_CONN_CREATING( msc )
|| LDAP_BACK_CONN_BINDING( msc ) )
{
rs->sr_err = LDAP_SUCCESS;
- do_return = 1;
+ return rs->sr_err;
} else if ( META_BACK_CONN_INITED( msc ) ) {
assert( msc->msc_ld != NULL );
rs->sr_err = LDAP_SUCCESS;
- do_return = 1;
+ return rs->sr_err;
} else {
/*
META_BACK_CONN_CREATING_SET( msc );
}
- if ( do_return ) {
- if ( rs->sr_err != LDAP_SUCCESS
- && op->o_conn
- && ( sendok & LDAP_BACK_SENDERR ) )
- {
- send_ldap_result( op, rs );
- }
-
- return rs->sr_err;
- }
-
assert( msc->msc_ld == NULL );
/*
#endif /* DEBUG_205 */
/* need to trash a failed Start TLS */
- asyncmeta_clear_one_msc( op, mc, candidate, 1, __FUNCTION__ );
+ asyncmeta_clear_one_msc( mt, msc, __FUNCTION__ );
goto error_return;
}
}
if ( rs->sr_err != LDAP_SUCCESS ) {
rs->sr_err = slap_map_api2result( rs );
- if ( sendok & LDAP_BACK_SENDERR ) {
- send_ldap_result( op, rs );
- }
}
return rs->sr_err;
}
SlapReply *rs,
SlapReply *candidates,
int *candidate,
- ldap_back_send_t sendok,
int alloc_new)
{
a_metainfo_t *mi = ( a_metainfo_t * )op->o_bd->be_private;
*/
candidates[ i ].sr_err = asyncmeta_init_one_conn( op,
rs, mc, i, LDAP_BACK_CONN_ISPRIV( &mc_curr ),
- LDAP_BACK_DONTSEND, !new_conn );
+ !new_conn );
if ( candidates[ i ].sr_err == LDAP_SUCCESS ) {
- if ( new_conn && ( sendok & LDAP_BACK_BINDING ) ) {
+ if ( new_conn ) {
LDAP_BACK_CONN_BINDING_SET( &mc->mc_conns[ i ] );
}
META_CANDIDATE_SET( &candidates[ i ] );
rs->sr_err = LDAP_NO_SUCH_OBJECT;
rs->sr_text = "Unable to select valid candidates";
- if ( sendok & LDAP_BACK_SENDERR ) {
- if ( rs->sr_err == LDAP_NO_SUCH_OBJECT ) {
- rs->sr_matched = mi->mi_suffix.bv_val;
- }
- send_ldap_result( op, rs );
- rs->sr_matched = NULL;
- }
ldap_pvt_thread_mutex_unlock(&mc->mc_om_mutex);
if ( alloc_new > 0) {
asyncmeta_back_conn_free( mc );
}
if ( i < 0 || rs->sr_err != LDAP_SUCCESS ) {
- if ( sendok & LDAP_BACK_SENDERR ) {
- if ( rs->sr_err == LDAP_NO_SUCH_OBJECT ) {
- rs->sr_matched = mi->mi_suffix.bv_val;
- }
- send_ldap_result( op, rs );
- rs->sr_matched = NULL;
- }
ldap_pvt_thread_mutex_unlock(&mc->mc_om_mutex);
if ( mc != NULL && alloc_new ) {
asyncmeta_back_conn_free( mc );
{
rs->sr_err = LDAP_UNWILLING_TO_PERFORM;
rs->sr_text = "Cross-target rename not supported";
- if ( sendok & LDAP_BACK_SENDERR ) {
- send_ldap_result( op, rs );
- }
ldap_pvt_thread_mutex_unlock(&mc->mc_om_mutex);
if ( mc != NULL && alloc_new > 0 ) {
asyncmeta_back_conn_free( mc );
* sends the appropriate result.
*/
err = asyncmeta_init_one_conn( op, rs, mc, i,
- LDAP_BACK_CONN_ISPRIV( &mc_curr ), sendok, !new_conn );
+ LDAP_BACK_CONN_ISPRIV( &mc_curr ), !new_conn );
if ( err != LDAP_SUCCESS ) {
/*
* FIXME: in case one target cannot
*/
int lerr = asyncmeta_init_one_conn( op, rs, mc, i,
LDAP_BACK_CONN_ISPRIV( &mc_curr ),
- LDAP_BACK_DONTSEND, !new_conn );
+ !new_conn );
candidates[ i ].sr_err = lerr;
if ( lerr == LDAP_SUCCESS ) {
META_CANDIDATE_SET( &candidates[ i ] );
}
if ( META_BACK_ONERR_STOP( mi ) ) {
- if ( sendok & LDAP_BACK_SENDERR ) {
- send_ldap_result( op, rs );
- }
ldap_pvt_thread_mutex_unlock(&mc->mc_om_mutex);
if ( alloc_new > 0 ) {
asyncmeta_back_conn_free( mc );
rs->sr_text = "Unable to select valid candidates";
}
- if ( sendok & LDAP_BACK_SENDERR ) {
- if ( rs->sr_err == LDAP_NO_SUCH_OBJECT ) {
- rs->sr_matched = mi->mi_suffix.bv_val;
- }
- send_ldap_result( op, rs );
- rs->sr_matched = NULL;
- }
if ( alloc_new > 0 ) {
asyncmeta_back_conn_free( mc );
rs->sr_err = LDAP_OTHER;
rs->sr_text = "Proxy bind collision";
- if ( sendok & LDAP_BACK_SENDERR ) {
- send_ldap_result( op, rs );
- }
return NULL;
}
}
int
asyncmeta_clear_one_msc(
- Operation *op,
- a_metaconn_t *mc,
- int candidate,
- int unbind,
+ a_metatarget_t *mt,
+ a_metasingleconn_t *msc,
const char *caller)
{
- a_metasingleconn_t *msc;
- if (mc == NULL) {
+
+ if (msc == NULL ) {
return 0;
}
- msc = &mc->mc_conns[candidate];
- if ( LogTest( asyncmeta_debug ) ) {
- char time_buf[ SLAP_TEXT_BUFLEN ];
- asyncmeta_get_timestamp(time_buf);
- Debug( asyncmeta_debug, "[%s] Resetting msc: %p, msc_ld: %p, "
- "msc_bound_ndn: %s, msc->conn: %p, %s \n",
- time_buf, msc, msc->msc_ld, msc->msc_bound_ndn.bv_val,
- msc->conn, caller ? caller : "" );
+
+ if ( LogTest( asyncmeta_debug ) && !slapd_shutdown ) {
+ if (( msc->msc_ld != NULL ) || ( msc->conn )
+ || !BER_BVISNULL( &msc->msc_bound_ndn )
+ || !BER_BVISNULL( &msc->msc_cred ) ) {
+ char time_buf[ SLAP_TEXT_BUFLEN ];
+ asyncmeta_get_timestamp(time_buf);
+ Debug( asyncmeta_debug, "[%s] Resetting msc: %p, msc_ld: %p, "
+ "msc_bound_ndn: %s, msc->conn: %p, %s \n",
+ time_buf, msc, msc->msc_ld, msc->msc_bound_ndn.bv_val,
+ msc->conn, caller ? caller : "" );
+ }
}
msc->msc_mscflags = 0;
if (msc->conn) {
}
if ( msc->msc_ld != NULL ) {
-
-#ifdef DEBUG_205
- Debug( LDAP_DEBUG_ANY, "### %s asyncmeta_clear_one_msc ldap_unbind_ext[%d] ld=%p\n",
- op ? op->o_log_prefix : "", candidate, (void *)msc->msc_ld );
-#endif /* DEBUG_205 */
-
ldap_unbind_ext( msc->msc_ld, NULL, NULL );
msc->msc_ld = NULL;
ldap_ld_free( msc->msc_ldr, 0, NULL, NULL );
}
if (msc->msc_active <= 1 && mc->mc_active < 1) {
bm_context_t *om;
- asyncmeta_clear_one_msc(NULL, mc, candidate, 0, caller);
+ asyncmeta_clear_one_msc(mc->mc_info->mi_targets[candidate], msc, caller);
/* set whatever's in the queue to invalid, so the timeout loop cleans it up,
* but do not invalidate the current op*/
LDAP_STAILQ_FOREACH( om, &mc->mc_om_list, bc_next ) {