mirror of
https://git.openldap.org/openldap/openldap.git
synced 2025-12-22 23:59:34 -05:00
don't risk leaving around client library error codes; try to return additional information
This commit is contained in:
parent
1242443553
commit
e338733c97
3 changed files with 23 additions and 8 deletions
|
|
@ -425,6 +425,7 @@ retry:;
|
||||||
if ( rc != LDAP_SUCCESS ) {
|
if ( rc != LDAP_SUCCESS ) {
|
||||||
rs->sr_err = rc;
|
rs->sr_err = rc;
|
||||||
}
|
}
|
||||||
|
rs->sr_err = slap_map_api2result( rs );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1042,10 +1043,12 @@ retry:;
|
||||||
rc = ldap_parse_result( msc->msc_ld, res, &rs->sr_err,
|
rc = ldap_parse_result( msc->msc_ld, res, &rs->sr_err,
|
||||||
&matched, &text, &refs, &ctrls, 1 );
|
&matched, &text, &refs, &ctrls, 1 );
|
||||||
res = NULL;
|
res = NULL;
|
||||||
|
if ( rc == LDAP_SUCCESS ) {
|
||||||
rs->sr_text = text;
|
rs->sr_text = text;
|
||||||
if ( rc != LDAP_SUCCESS ) {
|
} else {
|
||||||
rs->sr_err = rc;
|
rs->sr_err = rc;
|
||||||
}
|
}
|
||||||
|
rs->sr_err = slap_map_api2result( rs );
|
||||||
|
|
||||||
/* RFC 4511: referrals can only appear
|
/* RFC 4511: referrals can only appear
|
||||||
* if result code is LDAP_REFERRAL */
|
* if result code is LDAP_REFERRAL */
|
||||||
|
|
|
||||||
|
|
@ -485,6 +485,7 @@ retry:;
|
||||||
if ( rs->sr_err == LDAP_SUCCESS ) {
|
if ( rs->sr_err == LDAP_SUCCESS ) {
|
||||||
rs->sr_err = err;
|
rs->sr_err = err;
|
||||||
}
|
}
|
||||||
|
rs->sr_err = slap_map_api2result( rs );
|
||||||
|
|
||||||
/* FIXME: in case a referral
|
/* FIXME: in case a referral
|
||||||
* is returned, should we try
|
* is returned, should we try
|
||||||
|
|
|
||||||
|
|
@ -387,10 +387,8 @@ meta_search_dobind_result(
|
||||||
NULL, NULL, NULL, NULL, 0 );
|
NULL, NULL, NULL, NULL, 0 );
|
||||||
if ( rc != LDAP_SUCCESS ) {
|
if ( rc != LDAP_SUCCESS ) {
|
||||||
candidates[ candidate ].sr_err = rc;
|
candidates[ candidate ].sr_err = rc;
|
||||||
|
|
||||||
} else {
|
|
||||||
rc = slap_map_api2result( &candidates[ candidate ] );
|
|
||||||
}
|
}
|
||||||
|
rc = slap_map_api2result( &candidates[ candidate ] );
|
||||||
|
|
||||||
ldap_pvt_thread_mutex_lock( &mi->mi_conninfo.lai_mutex );
|
ldap_pvt_thread_mutex_lock( &mi->mi_conninfo.lai_mutex );
|
||||||
LDAP_BACK_CONN_BINDING_CLEAR( msc );
|
LDAP_BACK_CONN_BINDING_CLEAR( msc );
|
||||||
|
|
@ -688,6 +686,7 @@ meta_back_search( Operation *op, SlapReply *rs )
|
||||||
int is_ok = 0;
|
int is_ok = 0;
|
||||||
void *savepriv;
|
void *savepriv;
|
||||||
SlapReply *candidates = NULL;
|
SlapReply *candidates = NULL;
|
||||||
|
int do_taint = 0;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* controls are set in ldap_back_dobind()
|
* controls are set in ldap_back_dobind()
|
||||||
|
|
@ -1292,11 +1291,12 @@ really_bad:;
|
||||||
msg,
|
msg,
|
||||||
&candidates[ i ].sr_err,
|
&candidates[ i ].sr_err,
|
||||||
(char **)&candidates[ i ].sr_matched,
|
(char **)&candidates[ i ].sr_matched,
|
||||||
NULL /* (char **)&candidates[ i ].sr_text */ ,
|
(char **)&candidates[ i ].sr_text,
|
||||||
&references,
|
&references,
|
||||||
NULL /* &candidates[ i ].sr_ctrls (unused) */ ,
|
NULL /* &candidates[ i ].sr_ctrls (unused) */ ,
|
||||||
0 );
|
0 );
|
||||||
if ( rs->sr_err != LDAP_SUCCESS ) {
|
if ( rs->sr_err != LDAP_SUCCESS ) {
|
||||||
|
candidates[ i ].sr_err = rs->sr_err;
|
||||||
sres = slap_map_api2result( &candidates[ i ] );
|
sres = slap_map_api2result( &candidates[ i ] );
|
||||||
candidates[ i ].sr_type = REP_RESULT;
|
candidates[ i ].sr_type = REP_RESULT;
|
||||||
ldap_msgfree( res );
|
ldap_msgfree( res );
|
||||||
|
|
@ -1438,9 +1438,12 @@ really_bad:;
|
||||||
if ( rs->sr_nentries == op->ors_slimit
|
if ( rs->sr_nentries == op->ors_slimit
|
||||||
|| META_BACK_ONERR_STOP( mi ) )
|
|| META_BACK_ONERR_STOP( mi ) )
|
||||||
{
|
{
|
||||||
|
char *save_text = rs->sr_text;
|
||||||
savepriv = op->o_private;
|
savepriv = op->o_private;
|
||||||
op->o_private = (void *)i;
|
op->o_private = (void *)i;
|
||||||
|
rs->sr_text = candidates[ i ].sr_text;
|
||||||
send_ldap_result( op, rs );
|
send_ldap_result( op, rs );
|
||||||
|
rs->sr_text = save_text;
|
||||||
op->o_private = savepriv;
|
op->o_private = savepriv;
|
||||||
ldap_msgfree( res );
|
ldap_msgfree( res );
|
||||||
res = NULL;
|
res = NULL;
|
||||||
|
|
@ -1451,9 +1454,12 @@ really_bad:;
|
||||||
default:
|
default:
|
||||||
candidates[ i ].sr_err = rs->sr_err;
|
candidates[ i ].sr_err = rs->sr_err;
|
||||||
if ( META_BACK_ONERR_STOP( mi ) ) {
|
if ( META_BACK_ONERR_STOP( mi ) ) {
|
||||||
|
char *save_text = rs->sr_text;
|
||||||
savepriv = op->o_private;
|
savepriv = op->o_private;
|
||||||
op->o_private = (void *)i;
|
op->o_private = (void *)i;
|
||||||
|
rs->sr_text = candidates[ i ].sr_text;
|
||||||
send_ldap_result( op, rs );
|
send_ldap_result( op, rs );
|
||||||
|
rs->sr_text = save_text;
|
||||||
op->o_private = savepriv;
|
op->o_private = savepriv;
|
||||||
ldap_msgfree( res );
|
ldap_msgfree( res );
|
||||||
res = NULL;
|
res = NULL;
|
||||||
|
|
@ -1801,12 +1807,17 @@ finish:;
|
||||||
&& op->o_time > mc->mc_conns[ i ].msc_time )
|
&& op->o_time > mc->mc_conns[ i ].msc_time )
|
||||||
{
|
{
|
||||||
/* don't let anyone else use this expired connection */
|
/* don't let anyone else use this expired connection */
|
||||||
LDAP_BACK_CONN_TAINTED_SET( mc );
|
do_taint++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( mc ) {
|
if ( mc ) {
|
||||||
meta_back_release_conn( mi, mc );
|
ldap_pvt_thread_mutex_lock( &mi->mi_conninfo.lai_mutex );
|
||||||
|
if ( do_taint ) {
|
||||||
|
LDAP_BACK_CONN_TAINTED_SET( mc );
|
||||||
|
}
|
||||||
|
meta_back_release_conn_lock( mi, mc, 0 );
|
||||||
|
ldap_pvt_thread_mutex_unlock( &mi->mi_conninfo.lai_mutex );
|
||||||
}
|
}
|
||||||
|
|
||||||
return rs->sr_err;
|
return rs->sr_err;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue