From 6155d911438a3003f44f815a007797297581c0c2 Mon Sep 17 00:00:00 2001 From: Pierangelo Masarati Date: Fri, 26 Jan 2007 01:59:30 +0000 Subject: [PATCH] don't return adminLimitExceeded unless LDAPv3; use largest among candidates timeouts --- servers/slapd/back-ldap/search.c | 3 ++- servers/slapd/back-meta/search.c | 18 +++++++++++++----- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/servers/slapd/back-ldap/search.c b/servers/slapd/back-ldap/search.c index ea3934437a..1154d44d82 100644 --- a/servers/slapd/back-ldap/search.c +++ b/servers/slapd/back-ldap/search.c @@ -289,7 +289,8 @@ retry: if ( rc == 0 ) { (void)ldap_back_cancel( lc, op, rs, msgid, LDAP_BACK_DONTSEND ); rs->sr_text = "Operation timed out"; - rc = rs->sr_err = LDAP_ADMINLIMIT_EXCEEDED; + rc = rs->sr_err = op->o_protocol >= LDAP_VERSION3 ? + LDAP_ADMINLIMIT_EXCEEDED : LDAP_OTHER; goto finish; } diff --git a/servers/slapd/back-meta/search.c b/servers/slapd/back-meta/search.c index 618c5224fa..ba163e9f09 100644 --- a/servers/slapd/back-meta/search.c +++ b/servers/slapd/back-meta/search.c @@ -666,7 +666,8 @@ meta_back_search( Operation *op, SlapReply *rs ) struct timeval save_tv = { 0, 0 }, tv; time_t stoptime = (time_t)(-1), - lastres_time = slap_get_time(); + lastres_time = slap_get_time(), + timeout = 0; int rc = 0, sres = LDAP_SUCCESS; char *matched = NULL; int last = 0, ncandidates = 0, @@ -717,6 +718,13 @@ getconn:; candidates[ i ].sr_text = NULL; candidates[ i ].sr_ref = NULL; candidates[ i ].sr_ctrls = NULL; + + /* get largest timeout among candidates */ + if ( mi->mi_targets[ i ]->mt_timeout[ SLAP_OP_SEARCH ] + && mi->mi_targets[ i ]->mt_timeout[ SLAP_OP_SEARCH ] > timeout ) + { + timeout = mi->mi_targets[ i ]->mt_timeout[ SLAP_OP_SEARCH ]; + } } for ( i = 0; i < mi->mi_ntargets; i++ ) { @@ -865,13 +873,13 @@ getconn:; time_t curr_time = 0; /* check timeout */ - if ( mi->mi_timeout[ SLAP_OP_SEARCH ] - && lastres_time > 0 - && ( slap_get_time() - lastres_time ) > mi->mi_timeout[ SLAP_OP_SEARCH ] ) + if ( timeout && lastres_time > 0 + && ( slap_get_time() - lastres_time ) > timeout ) { doabandon = 1; rs->sr_text = "Operation timed out"; - rc = rs->sr_err = LDAP_ADMINLIMIT_EXCEEDED; + rc = rs->sr_err = op->o_protocol >= LDAP_VERSION3 ? + LDAP_ADMINLIMIT_EXCEEDED : LDAP_OTHER; savepriv = op->o_private; op->o_private = (void *)i; send_ldap_result( op, rs ); -- 2.39.5