From f8e5ed25e96805959f9a385212d7bad2a1c5eff3 Mon Sep 17 00:00:00 2001 From: Kurt Zeilenga Date: Wed, 11 Oct 2000 21:11:34 +0000 Subject: [PATCH] Revised ITS#799 fix from Steve Sonntag The problem is that the current code checks the queue inside the test for correct connecction state, so sometimes the queue doesn't get checked. This change moves the test outside the connection check. --- libraries/libldap/result.c | 107 ++++++++++++++++++++++--------------- 1 file changed, 63 insertions(+), 44 deletions(-) diff --git a/libraries/libldap/result.c b/libraries/libldap/result.c index 3b2a081220..396ce8ff64 100644 --- a/libraries/libldap/result.c +++ b/libraries/libldap/result.c @@ -130,14 +130,19 @@ chkResponseList( LDAP *ld, * wait until it arrives or timeout occurs. */ + Debug( LDAP_DEBUG_TRACE, "chkResponseList for msgid %d, all %d\n", + msgid, all, 0 ); lastlm = NULL; for ( lm = ld->ld_responses; lm != NULL; lm = nextlm ) { nextlm = lm->lm_next; if ( ldap_abandoned( ld, lm->lm_msgid ) ) { + Debug( LDAP_DEBUG_TRACE, "chkResponseList msg abandoned, msgid %d\n", + msgid, 0, 0 ); ldap_mark_abandoned( ld, lm->lm_msgid ); if ( lastlm == NULL ) { + /* Remove first entry in list */ ld->ld_responses = lm->lm_next; } else { lastlm->lm_next = nextlm; @@ -172,6 +177,7 @@ chkResponseList( LDAP *ld, lastlm = lm; } if ( lm != NULL ) { + /* Found an entry, remove it from the list */ if ( lastlm == NULL ) { ld->ld_responses = (all == LDAP_MSG_ONE && lm->lm_chain != NULL ? lm->lm_chain : lm->lm_next); @@ -186,6 +192,15 @@ chkResponseList( LDAP *ld, } lm->lm_next = NULL; } + +#ifdef LDAP_DEBUG + if( lm == NULL) { + Debug( LDAP_DEBUG_TRACE, "chkResponseList returns NULL\n", 0, 0, 0); + } else { + Debug( LDAP_DEBUG_TRACE, "chkResponseList returns msgid %d, type %lu\n", + lm->lm_msgid, (unsigned long) lm->lm_msgtype, 0); + } +#endif return lm; } static int @@ -226,61 +241,65 @@ wait4msg( rc = -2; while ( rc == -2 ) { #ifdef LDAP_DEBUG + Debug( LDAP_DEBUG_TRACE, "wait4msg continue, msgid %d, all %d\n", + msgid, all, 0 ); if ( ldap_debug & LDAP_DEBUG_TRACE ) { ldap_dump_connection( ld, ld->ld_conns, 1 ); ldap_dump_requests_and_responses( ld ); } #endif /* LDAP_DEBUG */ - for ( lc = ld->ld_conns; lc != NULL; lc = lc->lconn_next ) { - if ( ber_sockbuf_ctrl( lc->lconn_sb, - LBER_SB_OPT_DATA_READY, NULL ) ) { - if( (*result = chkResponseList(ld, msgid, all)) == NULL ) { - rc = try_read1msg( ld, msgid, all, lc->lconn_sb, - lc, result ); - } else { - rc = (*result)->lm_msgtype; - } - break; - } - } - if ( lc == NULL ) { - rc = do_ldap_select( ld, tvp ); + if( (*result = chkResponseList(ld, msgid, all)) != NULL ) { + rc = (*result)->lm_msgtype; + } else { + + for ( lc = ld->ld_conns; lc != NULL; lc = lc->lconn_next ) { + if ( ber_sockbuf_ctrl( lc->lconn_sb, + LBER_SB_OPT_DATA_READY, NULL ) ) { + rc = try_read1msg( ld, msgid, all, lc->lconn_sb, + lc, result ); + break; + } + } + + if ( lc == NULL ) { + rc = do_ldap_select( ld, tvp ); #ifdef LDAP_DEBUG - if ( rc == -1 ) { - Debug( LDAP_DEBUG_TRACE, - "do_ldap_select returned -1: errno %d\n", - errno, 0, 0 ); - } + if ( rc == -1 ) { + Debug( LDAP_DEBUG_TRACE, + "do_ldap_select returned -1: errno %d\n", + errno, 0, 0 ); + } #endif - if ( rc == 0 || ( rc == -1 && ( - !LDAP_BOOL_GET(&ld->ld_options, LDAP_BOOL_RESTART) - || errno != EINTR ))) - { - ld->ld_errno = (rc == -1 ? LDAP_SERVER_DOWN : - LDAP_TIMEOUT); - return( rc ); - } - - if ( rc == -1 ) { - rc = -2; /* select interrupted: loop */ - } else { - rc = -2; - for ( lc = ld->ld_conns; rc == -2 && lc != NULL; - lc = nextlc ) { - nextlc = lc->lconn_next; - if ( lc->lconn_status == - LDAP_CONNST_CONNECTED && - ldap_is_read_ready( ld, - lc->lconn_sb )) { - rc = try_read1msg( ld, msgid, all, - lc->lconn_sb, lc, result ); - } - } - } + if ( rc == 0 || ( rc == -1 && ( + !LDAP_BOOL_GET(&ld->ld_options, LDAP_BOOL_RESTART) + || errno != EINTR ))) + { + ld->ld_errno = (rc == -1 ? LDAP_SERVER_DOWN : + LDAP_TIMEOUT); + return( rc ); + } + + if ( rc == -1 ) { + rc = -2; /* select interrupted: loop */ + } else { + rc = -2; + for ( lc = ld->ld_conns; rc == -2 && lc != NULL; + lc = nextlc ) { + nextlc = lc->lconn_next; + if ( lc->lconn_status == + LDAP_CONNST_CONNECTED && + ldap_is_read_ready( ld, + lc->lconn_sb )) { + rc = try_read1msg( ld, msgid, all, + lc->lconn_sb, lc, result ); + } + } + } + } } if ( rc == -2 && tvp != NULL ) { -- 2.39.5